2016-03-22 7 views
0

Ich habe zwei tabstoppgetrennten Dateien, f1 und f2, die wie folgt aussehen:Awk: split Feldelement von einer Datei zur anderen verketten basierend auf gemeinsamen Feld

f1:

id1 r1 
id2 r2 
id3 r3 
... 
idN rN 

f2:

wobei N und M unterschiedlich sein können. Ich suche ein assoziatives Array von f1 und verketten die zweite Spalte von f1 bis Ende f2, so dass die Ausgabe zu erstellen:

f1 g1 x1;id1=r1 
f2 g2 x2;id2=r2 
... 

Als Test, ich habe dies auszuführen:

awk 'BEGIN{FS=OFS="\t"} NR==FNR{id[$1]=$1; r[$1]=$2; next} {split($3,a,";"); if (a[2] in id) {print "found"} else {print "not found"}}' f1 f2

die Ausgabe gibt:

found 
found 
not found 
... 

den folgenden Befehl ausführen jedoch:

awk 'BEGIN{FS=OFS="\t"} NR==FNR{id[$1]=$1; r[$1]=$2; next} {split($3,a,";"); if (a[2] in id) {$3=$3"="r[$1]; print} else {print "not found"}}' f1 f2

gibt die Ausgabe:

f1  g1  x1;id1= 
f2  g2  x2;id2= 
not found 
... 

Meine Frage ist: Wie kann ich den Wert mit dem Schlüssel verbunden, so zugreifen, dass ich es in die dritte Spalte von f2 anhängen?

+2

Bitte entfernen Sie alle '...' s, sie nur Ihre Beispiele überfluten und machen es so, dass wir sie nicht kopieren/einfügen können, um eine mögliche Lösung gegen zu testen. –

Antwort

1

join ist das Werkzeug zum Verbinden von Dateien, besonders wenn sie bereits nach dem Schlüssel sortiert sind.

$ join -14 <(sed 's/;/; /' file2) file1 | 
    awk '{print $2,$3,$4$1 "=" $5}' 

f1 g1 x1;id1=r1 
f2 g2 x2;id2=r2 

jedoch ist ihr Ausgabeformat nicht Standard, so müssen awk für diesen Zweck. Ich denke, in diesem Fall kann das ganze Skript auch in awk gemacht werden.

Verwandte Themen