Komm - comm
| Originalautor(en) | Lee E. McMahon |
|---|---|
| Entwickler | AT&T Bell Laboratories , Richard Stallman , David MacKenzie |
| Erstveröffentlichung | November 1973 |
| 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
- Vergleich von Dateivergleichstools
- Liste der Unix-Befehle
- cmp (Unix) – zeichenorientierter Dateivergleich
- cut (Unix) – spaltenorientierte Dateien aufteilen
Verweise
Externe Links
- : Zeilen auswählen oder ablehnen, die zwei Dateien gemeinsam haben – Commands & Utilities Reference, The Single UNIX Specification , Issue 7 von The Open Group
- – Plan 9 Programmierhandbuch, Band 1
- – Inferno Allgemeine Befehle Handbuch