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:
FNRist die Datensatznummer der aktuellen DateiNRist die aktuelle Gesamtdatensatznummer aus allen EingabedateienFNR==NRist nur wahr, wenn wir Datei1 lesen$0ist 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