
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 f1Col1
ist die erste Spalte von file1
usw.
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, file1
aber Leerzeichen anstelle der Spalten aus druckt file2
. Was ist hier falsch?
(Hinweis: Ich verwende OS X Yosemite)
Antwort1
Wenn file2
enthält (zum Beispiel)
The quick brown
fox jumps over
the lazy dog.
awk
dann 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