Verwenden einiger weniger bekannter Dienstprogramme:
sort file1 > file1.sorted
sort file2 > file2.sorted
comm -1 -3 file1.sorted file2.sorted
Dadurch werden Duplikate ausgegeben, wenn also 1 3
vorhanden ist in file1
, aber 2 in file2
, dies wird immer noch 1 3
ausgeben . Wenn Sie dies nicht möchten, leiten Sie die Ausgabe von sort
weiter bis uniq
bevor es in eine Datei geschrieben wird:
sort file1 | uniq > file1.sorted
sort file2 | uniq > file2.sorted
comm -1 -3 file1.sorted file2.sorted
Es gibt viele Dienstprogramme im Paket GNU coreutils, die alle Arten von Textmanipulationen ermöglichen.
$ awk 'FNR==NR {a[$0]++; next} !($0 in a)' file1 file2
6
7
Erklärung, wie der Code funktioniert:
- Wenn wir an Datei1 arbeiten, verfolgen Sie jede Textzeile, die wir sehen.
- Wenn wir an Datei2 arbeiten und den Zeilentext nicht gesehen haben, drucken Sie ihn aus.
Erläuterung der Einzelheiten:
FNR
ist die Datensatznummer der aktuellen DateiNR
ist die aktuelle Gesamtdatensatznummer aus allen EingabedateienFNR==NR
ist nur wahr, wenn wir Datei1 lesen$0
ist die aktuelle Textzeilea[$0]
ist ein Hash, bei dem der Schlüssel auf die aktuelle Textzeile gesetzt ista[$0]++
verfolgt, dass wir die aktuelle Textzeile gesehen haben!($0 in a)
ist nur wahr, wenn wir den Zeilentext nicht gesehen haben- Drucken Sie die Textzeile, wenn das obige Muster wahr zurückgibt, dies ist das Standardverhalten von awk, wenn keine explizite Aktion gegeben wird