Wie kann ich einer Datei eine Spalte hinzufügen, die mit einer anderen Spalte übereinstimmt?

Wie kann ich einer Datei eine Spalte hinzufügen, die mit einer anderen Spalte übereinstimmt?

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.

file1Beachten 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 bashoder 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==FNRstellt sicher, dass {ar[$2]=$0;next}nur für die erste Datei gearbeitet wird, da die erste Datei nach dem Lesen FNRauf Null gesetzt wird. Im Ausdruck wird ein indiziertes {ar[$2]=$0;next}Array erstellt und es werden keine weiteren Aktionen ausgeführt.ar$2next

Der Ausdruck ($1 in ar)prüft, ob $1(erstes Feld der zweiten Datei) vorhanden ist inIndizesdes Arrays ar. Wenn vorhanden, wird ardurch 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 arist auf $2 der ersten Datei indiziert. Dies prüft also, ob $1die zweite Datei $2mit der ersten Datei übereinstimmt.

verwandte Informationen