Zusammenführen von 2 Dateien basierend auf Feldübereinstimmung

Zusammenführen von 2 Dateien basierend auf Feldübereinstimmung

Ich möchte eine Datei erstellen, die Spalten aus zwei Eingabedateien enthält. Datei1 sieht so aus:

aa 32
bb 15
cc 78

Datei2 ist:

fa 19
bc 23
cc 50
de 28
aa 45
bb 31

Die Aufgabe besteht darin, Datei1 zu lesen und festzustellen, ob das 1. Feld einer Zeile im 1. Feld von Datei2 vorhanden ist. Anschließend diese Zeile von Datei2 mit beiden Spalten auszudrucken und den Eintrag der 2. Spalte von Datei1 hinzuzufügen, der das 1. Feld enthält.

Die Ausgabe sollte wie folgt aussehen:

aa 45 32
bb 31 15
cc 50 78

Für das Skript wird awk bevorzugt.

Antwort1

$ awk 'FNR==NR{a[$1]=$2;next} ($1 in a) {print $1,a[$1],$2}' file2 file1
aa 45 32
bb 31 15
cc 50 78

Erläuterung:

awkdurchläuft implizit jede Datei Zeile für Zeile. Da wir es file2als erstes Argument angegeben haben, wird es zuerst gelesen. file1wird als zweites gelesen.

  • FNR==NR{a[$1]=$2;next}

    NRist die Anzahl der Zeilen, die awkbisher gelesen wurden, und FNRist die Anzahl der Zeilen, die awkbisher aus der aktuellen Datei gelesen wurden. Wenn also FNR==NR, lesen wir immer noch die erste benannte Datei: file2. Für jede Zeile in file2weisen wir zu a[$1]=$2.

    Hier aist einassoziatives Arrayund a[$1]=$2bedeutet, die zweite Spalte von Datei2, bezeichnet mit $2, als Wert im Array zu speichern a, wobei die erste Spalte von Datei2, $1, als Schlüssel verwendet wird.

    nextweist an awk, die restlichen Befehle zu überspringen und mit der nächsten Zeile neu zu beginnen.

  • ($1 in a) {print $1,a[$1],$2}

    Wenn wir hierher gelangen, bedeutet das, dass wir die zweite Datei lesen: file1. Wenn wir das erste Feld der Zeile in gesehen haben file2, wie durch den Inhalt des Arrays bestimmt a, dann drucken wir eine Zeile mit den Werten von Feld 2 aus beiden Dateien aus.

Antwort2

Mir gefällt die awk-Lösung, aber ich denke, das hier könnte einfacher sein:

sort file1 > sortedFile1
sort file2 > sortedFile2
join -o 1.1 2.2 1.2 sortedFile1 sortedFile2

Die Option -oüberschreibt das Format, das Sie als erstes Feld der ersten Datei, zweites Feld der zweiten Datei und zweites Feld der ersten Datei auswählen.

Antwort3

Fügen Sie die 2. Datei File2zur 1. Datei hinzu File1.

join <(sort -k1 file2) <(sort -k1 file1)

verwandte Informationen