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:
awk
durchläuft implizit jede Datei Zeile für Zeile. Da wir es file2
als erstes Argument angegeben haben, wird es zuerst gelesen. file1
wird als zweites gelesen.
FNR==NR{a[$1]=$2;next}
NR
ist die Anzahl der Zeilen, dieawk
bisher gelesen wurden, undFNR
ist die Anzahl der Zeilen, dieawk
bisher aus der aktuellen Datei gelesen wurden. Wenn alsoFNR==NR
, lesen wir immer noch die erste benannte Datei:file2
. Für jede Zeile infile2
weisen wir zua[$1]=$2
.Hier
a
ist einassoziatives Arrayunda[$1]=$2
bedeutet, die zweite Spalte von Datei2, bezeichnet mit$2
, als Wert im Array zu speicherna
, wobei die erste Spalte von Datei2,$1
, als Schlüssel verwendet wird.next
weist anawk
, 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 habenfile2
, wie durch den Inhalt des Arrays bestimmta
, 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 File2
zur 1. Datei hinzu File1
.
join <(sort -k1 file2) <(sort -k1 file1)