awk 使用哈希合併兩個文件

awk 使用哈希合併兩個文件

我有兩個長度相同的文件,我想用另一個文件的內容交換一個文件的 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."

當您嘗試在腳本的第二部分中使用這些已儲存的值時,這對您沒有任何好處;您需要按行號對數組進行索引:

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 指令放在 '<( )' 之間,僅讀取標準輸出
  • 貼上逐行合併三個輸出文件

相關內容