2013-02-20 75 views
45

很多人非常有幫助張貼在一次AWK'ing多個輸入文件以下解決方案:使用AWK處理來自多個文件輸入

$ awk 'FNR==NR{a[$1]=$2 FS $3;next}{ print $0, a[$1]}' file2 file1 

這種運作良好,但我在想,如果我一個人可以向我解釋爲什麼?我發現AWK語法有點難以掌握,希望有人不介意爲我打破代碼片段。

回答

50
awk 'FNR==NR{a[$1]=$2 FS $3;next} 

這裏我們處理第一個輸入(file2)。說,FS是空間,我們建立一個數組(a),索引是column1,值是column2 " " column3FNR==NR and next表示,這部分代碼只對file2有效。你可以GAWK男人檢查什麼是NR和FNR

{ print $0, a[$1]}' file2 file1 

NR != FNR它的時間來處理第二輸入,文件1。這裏我們打印file1的行,並以column1作爲索引,找出數組(a)中的值print。換句話說,file1和file2在兩個文件中都由column1連接。

爲NR和FNR,不久,

1st input has 5 lines 
2nd input has 10 lines, 

NR would be 1,2,3...15 
FNR would be 1...5 then 1...10 

你看到FNR==NR檢查的伎倆。

+0

肯特,優秀的解釋;非常感謝你。我沒有意識到'FNR == NR'正在形成一種'if'陳述。這正是我需要向前邁進的。非常感謝您花時間幫助! – jkovba 2013-02-20 16:58:10

8

我發現在谷歌這個問題/答案,這似乎是參照了另一個問題(How to merge two files using AWK?)發現了一個很具體的數據集。接下來是我正在尋找的答案(而且我認爲大多數人會這樣做),即僅使用AWK連接來自兩個不同文件的每一行。雖然你很可能使用一些UNIX工具一樣加入,AWK顯然更加靈活和強大,如果您想要的輸出是不同的,通過使用如果陳述,或改變OFS(這可能是更難以視實用程序執行;見下文),例如,改變在一個更富於表現力的方式輸出(用於殼腳本人員考慮的重要因素)

對於簡單的行由行級聯:

awk 'FNR==NR { a[FNR""] = $0; next } { print a[FNR""], $0 }' file1 file2

這通過使用隱式類型轉換來模擬數字索引數組(AWK只有關聯數組)的功能。這是相對錶達和易於理解。

使用兩個文件名爲Test1和TEST2具有以下行:

測試1:

line one 
line two 
line three 

測試2:

line four 
line five 
line six 

我得到這樣的結果:

line one line four 
line two line five 
line three line six 

取決於何如果要連接輸出中各列之間的值,可以選擇適當的輸出字段分隔符。這是一個橢圓的例子(...)分離柱:

awk 'BEGIN { OFS="..."} FNR==NR { a[(FNR"")] = $0; next } { print a[(FNR"")], $0 }' test1 test2

屈服這樣的結果:

line one...line four 
line two...line five 
line three...line six 

我至少希望這激發你所有采取AWK的強大功能!

+4

如果目標只是並排連接列,那麼使用'paste'命令非常簡單。 – biocyberman 2015-10-21 18:10:18