Hallo, ich habe zwei Dateien mit einigen Dateinamen, die so aussehen:
Datei 1:
123.txt
456.txt
789.txt
101112.txt
Datei 2:
123.txt
789.txt
101112.txt
Gibt es einen Bash-Befehl, mit dem ich sie überlappen und nur die Zeilen oder Dateinamen drucken kann, die nicht übereinstimmen? Ich erwarte also so etwas:
456.txt
command-line
bash
Mailand
quelle
quelle
diff --suppress-common-lines
.file2
damit überlappt habefile1
456.txt
, möchte ich nicht mehr mithaltendiff --suppress-common-lines
sucht Differenz innerhalb jeder Zeile?man diff
für weitere Informationen.diff
ist dies das Standardwerkzeug dafür. Es gibt viele Optionen zur Steuerung des Verhaltens und verschiedene Ausgabeformate.Antworten:
comm
ist dein Freund hier:Wenn die Dateien bereits sortiert sind:
Wenn nicht sortiert,
sort
und übergeben Sie sie als Dateideskriptoren mithilfe der Prozessersetzung (damit wir keine temporären Dateien benötigen):Beispiel:
quelle
Ein einfacher Ansatz wäre die Verwendung von zwei 'grep'-Befehlen, die jeweils eine der Dateien als Liste von Zeilen verwenden, um die andere Datei zu durchsuchen. Angenommen, Ihre Dateien heißen f1.txt und f2.txt:
Die
grep
Optionen sind wie folgt:-F
- Verwenden Sie jede Zeile als feste Zeichenfolge und nicht als regulären Ausdruck-x
- Nur ganze Zeilen abgleichen-v
- Invertieren Sie die Übereinstimmung, um nicht übereinstimmende Linien auszuwählen-f
- Verwenden Sie die als Argument angegebene Datei als Liste der übereinstimmenden Musterquelle
-x
dies in diesem Fall noch notwendig wäre.Ich verstehe Ihre Frage so, wie Sie alle Zeilen, die nur in einer der Dateien erscheinen, nicht in beiden, und ohne Berücksichtigung der Zeilenreihenfolge.
Ich gehe auch davon aus, dass wir die Dateien
f1.txt
und vergleichenf2.txt
. Geben Sie stattdessen Ihre jeweiligen Namen ein.Mit Bash können Sie dies mit zwei Schleifen tun, wobei jede eine Datei verarbeitet und für jede Zeile prüft, ob sie in der anderen erscheint. Dieser Ansatz ist nicht sehr effizient, sollte aber funktionieren:
Beide Schleifen zusammen ergeben das gewünschte Ergebnis. Jeder für sich sucht nur nach Zeilen in einer Datei, die in der anderen nicht erscheinen.
Eine sauberere Lösung könnte zB mit einem kurzen Python-Einzeiler geschrieben werden:
Dies verwendet eine Set-Datenstruktur, die nur eindeutige Werte enthält und Set-Operationen wie "symmetrische Differenz" ermöglicht.
Beachten Sie, dass bei Verwendung beider Lösungen, wenn eine der Dateien doppelte Zeilen enthält, diese ignoriert und nur wie ein einziges Vorkommen behandelt werden.
quelle
Angenommen, Sie benötigen die Ergebnisse nicht, um in der ursprünglichen Reihenfolge zu bleiben, verwenden Sie einfach:
Erläuterung:
Gibt beide Dateien nacheinander als Standardausgabe aus.
Sortiert den kombinierten Inhalt der beiden Dateien. Der nützliche Nebeneffekt, an dem wir interessiert sind, besteht darin, dass identische Zeilen aus beiden Dateien direkt nebeneinander stehen.
Gibt nur die Zeilen aus, die "eindeutig" sind, dh nur einmal vorkommen. Ärgerlicherweise werden hier nur Paare benachbarter Zeilen betrachtet, weshalb der vorherige
sort
Befehl erforderlich ist.Sie können auch
uniq -d
nur die Zeilen ausgeben, die zweimal vorkommen. Dadurch erhalten Sie die Zeilen, die beiden Dateien gemeinsam sind.HINWEIS: Ich bin nicht sicher, wie gut diese Lösung funktioniert, wenn dieselben Zeilen mehr als einmal in derselben Datei vorkommen.
quelle