Comm
Author
Albert Florescomm 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.
Použití
Nástroj comm načítá dva soubory jako vstup. Výstup příkazu comm obsahuje tři sloupce. +more 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
(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ů. +more 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“. +more 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. +more 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. +more 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ídaly 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ů.