Awk zum Zusammenführen zweier Dateien mithilfe von Hash

Awk zum Zusammenführen zweier Dateien mithilfe von Hash

Ich habe zwei Dateien gleicher Länge und möchte die drei Spalten einer Datei mit dem Inhalt einer anderen Datei austauschen. Ich möchte Folgendes drucken:

f1Col1 f1Col2 f1Col3 f1Col4 f1Col5 f1Col6 f2Col1 f2Col2 f2Col3 f1Col10 f1Col11 f1Col12

wo f1Col1ist die erste Spalte von file1usw.

Ich habe versucht, Folgendes zu verwenden:

awk 'NR==FNR {h1[$1] = $1; h2[$2] = $2; h3[$3] = $3; next} {print $1,$2,$3,$4,$5,$6,h1[$1],h2[$2],h3[$3],$10,$11,$12}' file2 file1

das alle notwendigen Spalten aus druckt, file1aber Leerzeichen anstelle der Spalten aus druckt file2. Was ist hier falsch?

(Hinweis: Ich verwende OS X Yosemite)

Antwort1

Wenn file2enthält (zum Beispiel)

The    quick    brown
fox    jumps    over
the    lazy     dog.

awkdann ist der erste Teil Ihres Skripts die Einstellung

h1["The"]="The"
h2["quick"]="quick"
h3["brown"]="brown"
h1["fox"]="fox"
h2["jumps"]="jumps"
h3["over"]="over"
h1["the"]="the"
h2["lazy"]="lazy"
h3["dog."]="dog."

Dies nützt Ihnen nichts, wenn Sie versuchen, die gespeicherten Werte im zweiten Teil des Skripts zu verwenden. Sie müssen die Arrays nach Zeilennummer indizieren:

h1[1]="The"
h2[1]="quick"
h3[1]="brown"
h1[2]="fox"
h2[2]="jumps"
h3[2]="over"
h1[3]="the"
h2[3]="lazy"
h3[3]="dog."

Ihr Skript muss also

awk 'NR==FNR {h1[FNR] = $1; h2[FNR] = $2; h3[FNR] = $3; next}
{print $1,$2,$3,$4,$5,$6,h1[FNR],h2[FNR],h3[FNR],$10,$11,$12}' file2 file1

Antwort2

Wie wäre es mit:

paste <(awk'{ print $1,$2,$3,$4,$5,$6 }' file1) <(awk '{ print $1,$2,$3 }' file2) <(awk '{ print $10,$11,$12 }' file1) 
  • Paste übernimmt die Eingaben aus den einzelnen Awk-Befehlen
  • durch Platzieren der awk-Befehle zwischen '<( )' wird nur die Standardausgabe gelesen
  • „paste“ fügt die drei Ausgabedateien zeilenweise zusammen

verwandte Informationen