Vergleichen Sie zwei Dateien basierend auf der ersten Spalte

Vergleichen Sie zwei Dateien basierend auf der ersten Spalte

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}file2Erste Spalte zum Erstellen von Array-Schlüsseln verwenden
    • NRverfolgt die Gesamtzahl der bisher gelesenen Datensätze und FNRhat nur die Datensatznummer für die aktuell gelesene Datei. NR==FNRGilt also nur für die erste Datei (vorausgesetzt, sie ist nicht leer).
  • FNR==1 || !($1 in a)für file1Datei, Kopfzeile drucken oder wenn die erste Spalte nicht im Array gefunden wirda
  • Verwenden Sie es awk -F'\t' '...', wenn Ihre Eingabe durch Tabulatoren und awk -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

fDadurch 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

verwandte Informationen