很多人非常有幫助張貼在一次AWK'ing多個輸入文件以下解決方案:使用AWK處理來自多個文件輸入
$ awk 'FNR==NR{a[$1]=$2 FS $3;next}{ print $0, a[$1]}' file2 file1
這種運作良好,但我在想,如果我一個人可以向我解釋爲什麼?我發現AWK語法有點難以掌握,希望有人不介意爲我打破代碼片段。
很多人非常有幫助張貼在一次AWK'ing多個輸入文件以下解決方案:使用AWK處理來自多個文件輸入
$ awk 'FNR==NR{a[$1]=$2 FS $3;next}{ print $0, a[$1]}' file2 file1
這種運作良好,但我在想,如果我一個人可以向我解釋爲什麼?我發現AWK語法有點難以掌握,希望有人不介意爲我打破代碼片段。
awk 'FNR==NR{a[$1]=$2 FS $3;next}
這裏我們處理第一個輸入(file2)。說,FS是空間,我們建立一個數組(a
),索引是column1,值是column2 " " column3
FNR==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
檢查的伎倆。
我發現在谷歌這個問題/答案,這似乎是參照了另一個問題(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的強大功能!
如果目標只是並排連接列,那麼使用'paste'命令非常簡單。 – biocyberman 2015-10-21 18:10:18
肯特,優秀的解釋;非常感謝你。我沒有意識到'FNR == NR'正在形成一種'if'陳述。這正是我需要向前邁進的。非常感謝您花時間幫助! – jkovba 2013-02-20 16:58:10