Komm - comm

Komm
Originalautor(en) Lee E. McMahon
Entwickler AT&T Bell Laboratories , Richard Stallman , David MacKenzie
Erstveröffentlichung November 1973 ; Vor 47 Jahren ( 1973-11 )
Betriebssystem Unix , Unix-like , Plan 9 , Inferno
Plattform Plattformübergreifend
Typ Befehl
Lizenz Coreutils : GPLv3+

Der comm - Befehl in der Unix - Familie von Computer - Betriebssystemen ist ein Dienstprogramm , das verwendet wird , um zwei vergleichen Dateien zur gemeinsamen und klaren Linien. comm ist im POSIX- Standard angegeben. Es ist seit Mitte bis Ende der 1980er Jahre auf Unix-ähnlichen Betriebssystemen weit verbreitet .

Geschichte

Geschrieben von Lee E. McMahon , erschien comm zum ersten Mal in Version 4 Unix .

Die in GNU Coreutils gebündelte Version von comm wurde von Richard Stallman und David MacKenzie geschrieben.

Verwendungszweck

comm liest zwei Dateien als Eingabe, die als Textzeilen betrachtet werden. comm gibt eine Datei aus, die drei Spalten enthält. Die ersten beiden Spalten enthalten Zeilen, die für die erste bzw. zweite Datei eindeutig sind. Die letzte Spalte enthält Zeilen, die beiden gemeinsam sind. Dies ist funktionell ähnlich zu diff .

Spalten werden normalerweise mit dem Zeichen <tab> unterschieden . Wenn die Eingabedateien Zeilen enthalten, die mit dem Trennzeichen beginnen, können die Ausgabespalten mehrdeutig werden.

Aus Effizienzgründen erwarten Standardimplementierungen von comm, dass beide Eingabedateien in derselben Zeilenkollatierungsreihenfolge lexikalisch sortiert sind. Die Art (Unix) Befehl kann für diesen Zweck verwendet werden.

Der comm- Algorithmus verwendet die Sortierfolge des aktuellen Gebietsschemas . Wenn die Zeilen in den Dateien nicht beide gemäß dem aktuellen Gebietsschema sortiert sind, ist das Ergebnis undefiniert.

Rückgabe Code

Im Gegensatz zu diff hat der Rückgabecode von comm keine logische Bedeutung bezüglich der Beziehung der beiden Dateien. Ein Returncode von 0 bedeutet Erfolg, ein Returncode >0 zeigt an, dass während der Verarbeitung ein Fehler aufgetreten ist.

Beispiel

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

Dies zeigt, dass beide Dateien eine Banane haben, aber nur bar eine zweite Banane.

Genauer gesagt hat die Ausgabedatei das folgende Aussehen. Beachten Sie, dass die Spalte durch die Anzahl der führenden Tabulatorzeichen interpretiert wird. \t steht für ein Tabulatorzeichen und \n steht für einen Zeilenumbruch ( Escapezeichen #Programmierung und Datenformate ).

0 1 2 3 4 5 6 7 8 9
0 \T \T ein P P l e \n
1 \T \T B ein n ein n ein \n
2 \T B ein n ein n ein \n
3 e g g P l ein n T \n
4 \T z du C C h ich n ich \n

Vergleich zu diff

Im Allgemeinen ist diff ein leistungsfähigeres Dienstprogramm als comm . Das einfachere comm eignet sich am besten für die Verwendung in Skripten.

Der Hauptunterschied zwischen comm und diff besteht darin, dass comm vor dem Sortieren Informationen über die Reihenfolge der Zeilen verwirft.

Ein kleiner Unterschied zwischen comm und diff besteht darin, dass comm nicht versucht anzuzeigen, dass sich eine Zeile zwischen den beiden Dateien "geändert" hat; Zeilen werden entweder in den Spalten "von Datei #1", "von Datei #2" oder "in beiden" angezeigt. Dies kann nützlich sein, wenn Sie möchten, dass zwei Linien als unterschiedlich betrachtet werden, auch wenn sie nur geringfügige Unterschiede aufweisen.

Andere Optionen

comm verfügt über Befehlszeilenoptionen , um jede der drei Spalten zu unterdrücken. Dies ist nützlich für die Skripterstellung.

Es besteht auch die Möglichkeit, eine Datei (aber nicht beide) von der Standardeingabe zu lesen.

Grenzen

Aus jeder Eingabedatei muss beim Zeilenvergleich bis zu einer vollen Zeile gepuffert werden, bevor die nächste Ausgabezeile geschrieben wird.

Einige Implementierungen lesen Zeilen mit der Funktion readlinebuffer(), die keine Zeilenlängenbeschränkungen auferlegt, wenn der Systemspeicher ausreicht.

Andere Implementierungen lesen Zeilen mit der Funktion fgets () . Diese Funktion erfordert einen festen Puffer. Bei diesen Implementierungen wird der Puffer oft gemäß dem POSIX- Makro LINE_MAX dimensioniert .

Siehe auch

Verweise

Externe Links