
同じ長さのファイルが 2 つあり、一方のファイルの 3 列をもう一方のファイルの内容と交換したいと考えています。次の内容を印刷します。
f1Col1 f1Col2 f1Col3 f1Col4 f1Col5 f1Col6 f2Col1 f2Col2 f2Col3 f1Col10 f1Col11 f1Col12
f1Col1
はの最初の列ですfile1
。
私は以下を使用しようとしました:
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
は、 の必要な列をすべて印刷しますfile1
が、 の列の代わりに空白を印刷しますfile2
。何が間違っているのでしょうか?
(注: OS X Yosemite を使用しています)
答え1
file2
(例)が含まれている場合
The quick brown
fox jumps over
the lazy dog.
スクリプトの最初の部分はawk
設定です
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."
保存した値をスクリプトの 2 番目の部分で使用しようとすると、これは役に立ちません。配列を行番号でインデックスする必要があります。
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."
だからあなたのスクリプトは
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
答え2
以下についてはどうでしょうか:
paste <(awk'{ print $1,$2,$3,$4,$5,$6 }' file1) <(awk '{ print $1,$2,$3 }' file2) <(awk '{ print $10,$11,$12 }' file1)
- 貼り付けは個々のawkコマンドからの入力を受け取ります
- awkコマンドを「<()」の間に置くと、標準出力のみが読み取られます。
- 貼り付けは3つの出力ファイルを行ごとに結合します