Comm

Comm
Comm-example.png
Beispiel Verwendung von Comm Befehl
Originalautor (en) Lee E. McMahon
Entwickler (en) AT & T Bell Laboratories, Richard Stallman, David Mackenzie
Erstveröffentlichung November 1973; Vor 48 Jahren
Geschrieben in C
Betriebssystem Unix, Unix-artig, Plan 9, Inferno
Plattform Plattformübergreifend
Typ Befehl
Lizenz CoreUtils: GPLV3+
Plan 9: MIT -Lizenz

Das Comm Befehl in der Unix Computerfamilie Betriebssysteme ist ein Dienstprogramm, das zum Vergleich von zwei verwendet wird Dateien für gemeinsame und unterschiedliche Linien. Comm ist in der angegeben Posix Standard. Es war weit verbreitet auf Unix-artig Betriebssysteme seit Mitte bis Ende der 1980er Jahre.

Geschichte

Geschrieben von Lee E. McMahon, Comm Erschienen zuerst in Version 4 Unix.[1]

Die Version von Comm gebündelt GNU CoreUtils wurde geschrieben von Richard Stallman und David Mackenzie.[2]

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 beides Linien. Dies ist funktional ähnlich wie diff.

Säulen werden typischerweise mit dem unterschieden Charakter. Wenn die Eingabedateien Zeilen enthalten, die mit dem Separatorzeichen beginnen, können die Ausgabespalten mehrdeutig werden.

Für Effizienz standardmäßigen Implementierungen von Comm Erwarten Sie, dass beide Eingabedateien in derselben Zeile sequenziert werden Kollation Bestellung, lexikalisch sortiert. Das sortieren (Unix) Der Befehl kann für diesen Zweck verwendet werden.

Das Comm Algorithmus verwendet die Sammelsequenz des Stroms Gebietsschema. Wenn die Zeilen in den Dateien nicht beide gemäß dem aktuellen Gebietsschema zusammengestellt werden, ist das Ergebnis undefiniert.

Rückgabe Code

nicht wie diff, der Rückgabecode von Comm hat keine logische Bedeutung für die Beziehung der beiden Dateien. Ein Rückgabecode von 0 zeigt den Erfolg an, ein Rückgabecode> 0 zeigt einen Fehler an, der während der Verarbeitung aufgetreten ist.

Beispiel

$ Katze FooApfel Banane Aubergine $ KatzenleisteApfel Banane Banane Zucchini $ Comm Foo Bar                  Apfel                   Banane           Banane Aubergine           Zucchini 

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

Ausführlicher ist die Ausgabedatei das folgende Erscheinungsbild. Beachten Sie, dass die Spalte durch die Anzahl der führenden Registerkarten -Zeichen interpretiert wird. \ t repräsentiert ein Registerkartenzeichen und \ n repräsentiert eine neue Linie (Escape Charakter#Programmierung und Datenformate).

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 i n i \n

Vergleich zu Diff

Allgemein gesagt, diff ist ein leistungsfähigeres Nutzen als Comm. Je einfacher Comm ist am besten für die Verwendung in Skripten geeignet.

Die primäre Unterscheidung zwischen Comm und diff ist das Comm Verwaltet Informationen über die Reihenfolge der Zeilen vor dem Sortieren.

Ein kleiner Unterschied zwischen Comm und diff ist das Comm Wird nicht versuchen, anzuzeigen, dass eine Zeile zwischen den beiden Dateien "geändert" hat; Die Zeilen sind entweder in "aus Datei #1", "aus Datei #2" oder "in beiden" Spalten angezeigt. Dies kann nützlich sein, wenn man möchte, dass zwei Zeilen als anders betrachtet werden, selbst wenn sie nur subtile Unterschiede aufweisen.

Andere Optionen

Comm hat Befehlszeilenoptionen Unterdrückung eines der drei Säulen. Dies ist nützlich für das Skripten.

Es gibt auch eine Option, um eine Datei (aber nicht beides) aus Standardeingaben zu lesen.

Grenzen

Bis zu einer vollständigen Zeile muss während des Zeilenvergleichs von jeder Eingabedatei gepuffert werden, bevor die nächste Ausgabezeile geschrieben wird.

Einige Implementierungen lesen Zeilen mit der Funktion ReadlineBuffer () Was keine Leitungslängengrenzen auferlegt, wenn der Systemspeicher ausreicht.

Andere Implementierungen lesen Zeilen mit der Funktion fgets(). Diese Funktion erfordert einen festen Puffer. Für diese Implementierungen wird der Puffer häufig nach dem dimensioniert Posix Makro Line_max.

Siehe auch

Verweise

  1. ^ McIlroy, M. D. (1987). A Research Unix Reader: Annotierte Auszüge aus dem Programmierhandbuch, 1971–1986 (PDF) (Technischer Bericht). Cstr. Bell Labs. 139.
  2. ^ "Comm (1): Vergleichen Sie zwei sortierte Dateienzeile nach Zeile - Linux Man Page".

Externe Links