Wie kann ich die erste Spalte von Datei1 anhand der Zahlen in der zweiten Spalte der Datei 2 zuordnen?
DateiDatei1
k002 25
k004 54
k003 23
DateiDatei2
25 h
23 j
54 hg
Gewünschte Ausgabe
k002 25 h
k003 23 j
k004 54 hg
Ich habe keine Ahnung, wie das geht, und ich habe keine ähnlichen Fragen gefunden.
awk 'matching {print ... $1, $2}' file1 file2 > file_des
Antwort1
Sie könnten vielleicht so etwas tun:
awk 'NR == FNR { x[$2]=$1; next} { print x[$1], $0 }' file1 file2
Wo:
FNR
: Die Eingabedatensatznummer in der aktuellen Eingabedatei.NR
: Die Gesamtzahl der bisher angezeigten Eingabedatensätze.
file1
Beachten Sie, dass dadurch der gesamte Speicher gelesen wird .
Antwort2
Wenn es Ihnen nicht wichtig ist, die ursprüngliche Dateireihenfolge beizubehalten, können Sie Folgendes verwenden join
:
# sort the first file:
sort -k2 file1 > nfile1
# Sort the second file:
sort file2 > nfile2
join -1 2 -2 1 -o 1.1,1.2,2.2 nfile1 nfile2 > joined_file
Oder wie von @Ed Morton vorgeschlagen: Wenn Sie bash
oder eine andere Shell verwenden, die Prozessersetzung unterstützt, können Sie die Erstellung temporärer Dateien folgendermaßen vermeiden:
join -1 2 -2 1 -o 1.1,1.2,2.2 <(sort -k2 file1) <(sort file2)
Antwort3
Verwendung von awk
:
awk 'NR==FNR{ar[$2]=$0;next}($1 in ar){print ar[$1],$2}' file1 file2
Dieser Befehl NR==FNR
stellt sicher, dass {ar[$2]=$0;next}
nur für die erste Datei gearbeitet wird, da die erste Datei nach dem Lesen FNR
auf Null gesetzt wird. Im Ausdruck wird ein indiziertes {ar[$2]=$0;next}
Array erstellt und es werden keine weiteren Aktionen ausgeführt.ar
$2
next
Der Ausdruck ($1 in ar)
prüft, ob $1
(erstes Feld der zweiten Datei) vorhanden ist inIndizesdes Arrays ar
. Wenn vorhanden, wird ar
durch diese Anweisung ein zweites Feld der zweiten Datei gedruckt {print ar[$1],$2}
.
($1 in ar)
ist wichtig, da dies bedeutet, ob $1 der zweiten Datei übereinstimmtIndizesvon ar
. Und ar
ist auf $2 der ersten Datei indiziert. Dies prüft also, ob $1
die zweite Datei $2
mit der ersten Datei übereinstimmt.