it-swarm.com.de

awk - vergleicht 2 Dateien und druckt Spalten aus beiden Dateien

Ich habe vor einiger Zeit etwas Ähnliches gepostet und dachte, der bereitgestellte Code könnte bei der Lösung meines Problems helfen, aber leider kann ich ihn nicht an meine Bedürfnisse anpassen: awk - vergleiche Dateien und drucke Zeilen aus beiden Dateien =

Also habe ich wieder 2 tabulatorgetrennte Dateien.

file_1.txt

Apple    2.5    5     7.2
great    3.8    10    3.6
see      7.6    3     4.9
tree     5.4    11    5
back     8.9    2     2.1

file_2.txt

Apple    :::N
back     :::ADJ
back     :::N      
around   :::ADV      
great    :::ADJ         
bee      :::N         
see      :::V      
tree     :::N         

Die Ausgabe sollte folgendermaßen aussehen:

Apple    :::N      2.5    5     7.2     
great    :::ADJ    3.8    10    3.6
back     :::ADJ    8.9    2     2.1
back     :::N      8.9    2     2.1
see      :::V      7.6    3     4.9
tree     :::N      5.4    11    5 

Der Unterschied zum anderen Beitrag besteht darin, dass ich nur die ersten Spalten von file_1.txt und file_2.txt vergleichen und dann die gesamte Zeile von file_1.txt mit Spalte 2 von file_1.txt in der Ausgangsdatei ausgeben möchte. Es ist mir egal, in welcher Reihenfolge $ 2 von file_2.txt im Outfile ausgegeben werden, daher könnte das Outfile auch so aussehen

back     8.9    2     2.1    :::N
back     8.9    2     2.1    :::V etc.

Das Problem sind die Duplikate in Spalte 1 wie hier. Ansonsten könnte ich natürlich einfach paste verwenden. Das Problem mit diesem awk-Kommando ist, dass es column2 in einem Array nicht liest und wenn ich ihm sage, dass es gedruckt werden soll, ist dies natürlich nicht möglich.

awk 'NR==FNR {a[$1]; next} $1 in a {print $0, a[$2]}' OFS='\t' file_2.txt file_1.txt > outfile.txt

Ich freue mich über jede Hilfe! Entschuldigung für die Dummheit auch hier, scheint mir völlig ratlos zu sein.

2
dani_anyman

Wenn Sie GNU awk (im Repository über das Paket gawk verfügbar) haben, das mehrdimensionale Arrays unterstützt, können Sie dies tun

gawk 'NR==FNR {a[$1][$2]++; next} $1 in a {for (x in a[$1]) print $0, x}' OFS="\t" file_2.txt file_1.txt

Ex.

$ gawk 'NR==FNR {a[$1][$2]++; next} $1 in a {for (x in a[$1]) print $0, x}' OFS="\t" file_2.txt file_1.txt
Apple   2.5     5       7.2     :::N
great   3.8     10      3.6     :::ADJ
see     7.6     3       4.9     :::V
tree    5.4     11      5       :::N
back    8.9     2       2.1     :::ADJ
back    8.9     2       2.1     :::N

Andernfalls, wenn die Ausgabereihenfolge nicht wichtig ist, besteht die einfachste Lösung wahrscheinlich darin, stattdessen den Befehl join zu verwenden:

$ join -t $'\t' <(sort file_1.txt) <(sort file_2.txt)
Apple   2.5     5       7.2     :::N
back    8.9     2       2.1     :::ADJ
back    8.9     2       2.1     :::N
great   3.8     10      3.6     :::ADJ
see     7.6     3       4.9     :::V
tree    5.4     11      5       :::N
3
steeldriver