comm

Z Multimediaexpo.cz

comm jev 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 standartu POSIX. Je běžnou součástí unixových systémů od druhé poloviny 80. let.

Obsah

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 byli dva řádky označeny rozdílnými, i v případě, že mají pouze drobné odlišnosti.

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