comm
comm
je v informatice název unixové utility pro příkazový řádek, která porovnává dva soubory a vyhledává v nich stejné a rozdílné řádky. Nástroj comm
je specifikován ve standardu POSIX. Je běžnou součástí unixových systémů od druhé poloviny 80. let.
Typ softwaru | standardní UNIXová utilita či příkaz |
---|---|
Některá data mohou pocházet z datové položky. |
Použití
Nástroj comm
načítá dva soubory jako vstup. Výstup příkazu comm
obsahuje tři sloupce. V prvních dvou sloupcích najdeme řádky, které jsou unikátní pro první a druhý soubor (v uvedeném pořadí). Třetí sloupec obsahuje řádky společné pro oba soubory. Tato funkce se podobá příkazu diff
.
Sloupce běžně odděluje znak <tab>
(tabulátor). Pokud soubor obsahuje řádek, který začíná oddělovacím znakem, mohou být hranice sloupců nejasné.
Z důvodu efektivnosti očekává standardní implementace příkazu comm
soubory se seřazenými řádky dle abecedního řazení. Jedním z řešení je použít příkaz sort
.
Algoritmus příkazu comm
využívá řadící sekvence aktuálního locale. Pokud nejsou řádky v obou souborech abecedně seřazeny podle aktuálního locale, není výsledek předem jasný.
Srovnání s diff
Podle běžných měřítek je diff
mnohem silnější nástroj než comm
. Jednoduchý comm
se tak nejlépe hodí do skriptů. Hlavním rozdílem mezi comm
a diff
je to, že comm
se zbavuje informací o pořadí řádků tříděním.
Drobný rozdíl mezi comm
a diff
je ten, že comm
se nepokusí o indikaci toho zda se řádek mezi dvěma soubory změnil. Řádky jsou uvedeny buď v sloupci „ze souboru #1“, „ze souboru #2“ nebo „oba“. Takové chování může být užitečné v případně, že si přejeme, aby byly dva řádky označeny jako rozdílné, i v případě, že se liší pouze v drobnostech.
Návratový kód
Oproti diff
, návratový kód příkazu comm
nemá logický význam, co se týče vztahu dvou souborů. Návratová kód 0 nám říká, že vše proběhlo bez chyby. Návratový kód větší než 0 vyhodnocujeme jako chybu během zpracování.
Další možnosti
comm
má parametry, které mohou potlačit kterýkoliv ze sloupců. Díky tomu je comm
užitečný zejména ve skriptech.
Příklad
Soubor foo
jablko banán lilek
Soubor bar
jablko banán banán zucchini
$ comm foo bar jablko banán banán lilek zucchini
Toto nám ukazuje, že oba soubory mají jeden banán, ale jenom bar má druhý banán.
Při bližším pohledu zjistíme, že výstupní soubor má následující tvar. Povšimněte si, že sloupec reprezentuje počet tabulátorů před znaky. Značka \t představuje znak tabulátoru a \n zase nový řádek (notace v jazyku C). Mezery nejsou součástí výstupního souboru.
\t \t j a b l k o \n \t \t b a n á n \n \t b a n á n \n l i l e k \n \t z u c c h i n i \n
V případě, že nechceme některý ze sloupců, tak jeho pořadí uvedeme jako parametr:
$ comm -12 foo bar jablko banán
V tomto případě jsme potlačili první dva sloupce, které odpovídali unikátním řádkům v obou souborech.
$ comm -3 foo bar banán lilek zucchini
Zde jsme zase potlačili shodné řádky obou souborů.
Související články
Reference
V tomto článku byl použit překlad textu z článku comm na anglické Wikipedii.