
Ich habe zwei Dateien und möchte eine neue Datei erhalten, die nur die Zeilen enthält, die in der ersten Datei vorhanden sind, nicht aber die der zweiten. Beispiel:
Datei1:
ID firstname lastname
1 John Wilkens
2 Andrea Smith
3 Matthew Freberg
4 Brenda Something
Datei2:
ID firstname lastname
1 John Wilkens
2 Andrea Willems
3 Jay Freberg
5 Mike Hart
Ausgabe:
ID firstname lastname
4 Brenda Something
Ich habe versucht, comm zu verwenden, aber das gibt auch die Zeilen an, in denen etwas geändert wurde, also beispielsweise die ID 2 und 3.
Können Sie mir dabei bitte helfen?
Antwort1
$ awk 'NR==FNR{a[$1]; next} FNR==1 || !($1 in a)' file2 file1
ID firstname lastname
4 Brenda Something
NR==FNR{a[$1]; next}
file2
Erste Spalte zum Erstellen von Array-Schlüsseln verwendenNR
verfolgt die Gesamtzahl der bisher gelesenen Datensätze undFNR
hat nur die Datensatznummer für die aktuell gelesene Datei.NR==FNR
Gilt also nur für die erste Datei (vorausgesetzt, sie ist nicht leer).
FNR==1 || !($1 in a)
fürfile1
Datei, Kopfzeile drucken oder wenn die erste Spalte nicht im Array gefunden wirda
- Verwenden Sie es
awk -F'\t' '...'
, wenn Ihre Eingabe durch Tabulatoren undawk -F, '...'
Kommas getrennt ist.
Wenn die erste Datei leer sein kann, verwenden Sie Folgendes:
awk '!f{a[$1]; next} FNR==1 || !($1 in a)' file2 f=1 file1
f
Dadurch wird ein Flag zwischen den beiden Dateien gesetzt .
Antwort2
In einer Bash-Befehlszeile können Sie Folgendes tun. Filtern Sie die IDs aus Datei2 und suchen Sie in Datei1 nach ihnen, aber nur am Zeilenanfang:
$ grep -vf <(< file2 tail -n+2 | grep -Eo '^[^ ]{1,}'|sed 's/.*/^& /') file1
ID firstname lastname
4 Brenda Something