komunikace - comm

komunikační
Původní autoři Lee E. McMahon
Vývojáři AT&T Bell Laboratories , Richard Stallman , David MacKenzie
První vydání Listopad 1973 ; Před 47 lety ( 1973-11 )
Operační systém Unix , podobný Unixu , Plan 9 , Inferno
Plošina Cross-platform
Typ Příkaz
Licence jádro : GPLv3+

Komunikační příkaz v Unix rodině počítačových operačních systémů je nástroj, který slouží k porovnání dvou souborů pro běžné a odlišných linií. Comm je specifikován ve standardu POSIX . Je široce dostupný v operačních systémech podobných Unixu od poloviny do konce 80. let minulého století.

Dějiny

Napsal Lee E. McMahon , komunikace se poprvé objevila ve verzi 4 Unix .

Verzi Comm v balíčku GNU coreutils napsali Richard Stallman a David MacKenzie.

Používání

Comm čte dva soubory jako vstup, považovány za řádky textu. Comm vypíše jeden soubor, který obsahuje tři sloupce. První dva sloupce obsahují řádky jedinečné pro první a druhý soubor. Poslední sloupec obsahuje řádky společné pro oba. To je funkčně podobné diffu .

Sloupce se obvykle rozlišují znakem <ta> . Pokud vstupní soubory obsahují řádky začínající znakem oddělovače, mohou být výstupní sloupce nejednoznačné.

Pro efektivitu standardní implementace komunikace očekávají, že oba vstupní soubory budou sekvenovány ve stejném pořadí řazení řádků , seřazené lexikálně. K tomuto účelu lze použít příkaz sort (Unix) .

Tyto komunikační algoritmus využívá posloupnosti řazení aktuální locale . Pokud řádky v souborech nejsou seřazeny podle aktuálního národního prostředí, výsledek není definován.

Návratový kód

Na rozdíl od diffu nemá návratový kód z komunikace žádný logický význam týkající se vztahu těchto dvou souborů. Návratový kód 0 znamená úspěch, návratový kód> 0 znamená, že během zpracování došlo k chybě.

Příklad

$ cat foo
apple
banana
eggplant
$ cat bar
apple
banana
banana
zucchini
$ comm foo bar
                  apple
                  banana
          banana
eggplant
          zucchini

To ukazuje, že oba soubory mají jeden banán, ale pouze bar má druhý banán.

Podrobněji má výstupní soubor následující vzhled. Sloupec je interpretován počtem úvodních znaků tabulátoru. \ t představuje znak tabulátoru a \ n představuje nový řádek ( znak Escape#Programovací a datové formáty ).

0 1 2 3 4 5 6 7 8 9
0 \ t \ t A p p l E \ n
1 \ t \ t b A n A n A \ n
2 \ t b A n A n A \ n
3 E G G p l A n t \ n
4 \ t z u C C h n \ n

Srovnání s diff

Obecně lze říci, že diff je výkonnější nástroj než Comm . Jednodušší komunikace je nejvhodnější pro použití ve skriptech.

Primární rozdíl mezi comm a diff je v tom, že comm zařadí informace o pořadí řádků před tříděním.

Drobný rozdíl mezi comm a diff je v tom, že comm se nepokusí naznačit, že se mezi těmito dvěma soubory „změnil“ řádek; řádky jsou buď uvedeny ve sloupcích „ze souboru č. 1“, „ze souboru č. 2“ nebo „v obou“. To může být užitečné, pokud si přejete, aby byly dva řádky považovány za odlišné, i když mají pouze jemné rozdíly.

Jiné možnosti

Comm možnosti příkazového řádku k potlačení některého ze tří sloupců. To je užitečné pro skriptování.

Existuje také možnost přečíst jeden soubor (ale ne oba) ze standardního vstupu.

Limity

Při porovnávání řádků před zapsáním dalšího výstupního řádku musí být z každého vstupního souboru uložena vyrovnávací paměť.

Některé implementace čtou řádky s funkcí readlinebuffer (), která neukládá žádná omezení délky řádku, pokud stačí systémová paměť.

Jiné implementace čtou řádky s funkcí fgets () . Tato funkce vyžaduje pevný buffer. U těchto implementací je vyrovnávací paměť často dimenzována podle makra POSIX LINE_MAX .

Viz také

Reference

externí odkazy