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 vergleichen f2.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:
# This loops over f1.txt and searches each line in f2.txt
while read line ; do grep -Fxqe "$line" f2.txt || echo "$line" ; done < f1.txt
# This loops over f2.txt and searches each line in f1.txt
while read line ; do grep -Fxqe "$line" f1.txt || echo "$line" ; done < f2.txt
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:
python3 -c 's1=set(open("f1.txt")); s2=set(open("f2.txt")); print(*s1.symmetric_difference(s2), sep="")'
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.
diff --suppress-common-lines
.