5詳解awk中的NR==FNR


將兩個文件具有相同列的行進行合並

[root@tyjs09 ~]# cat a
張三|000001
李四|000002
[root@tyjs09 ~]# cat b
000001|10
000001|20
000002|30
000002|15
[root@tyjs09 ~]# awk -F'|' 'NR==FNR{a[$2]=$0;next}{print a[$1] FS $2}' a b
張三|000001|10
張三|000001|20
李四|000002|30
李四|000002|15

解釋:

NR會將2個文件是為一個整體進行行計數,FNR會將每個文件是為一個整體進行技術,例如:

NR===>>123,456

FNR===>>123,123

本例中,當NR==FNR是為真,反之為假;為真時運行第一個動作{},不為真時就跳過第一個{},執行第二個{}。

$0表示整行,$1表示第一列,$2表示第二列

代碼解說:

當為真時,執行第一個文件a,a的文件內容如下你:

張三|000001
李四|000002

那么a[$2]=$0其實就是定義了一個變量,即:a[000001] = 張三|000001

next表示執行下一行或者下一個周期。

awk -F'|' 'NR==FNR{a[$2]=$0;next}{print a[$1] FS $2}' a b

 當NR!=FNR時,說明第一個文件已經執行完了,開始執行第二個文件了,第二個文件的內容如下:

000001|10
000001|20
000002|30
000002|15

那么a[$1]==a[00001]

請看兩個紅色的區域,將兩個文件相同的內容作為每個文件的key值,a[$2], a[$1]其實這兩個key都是a[000001]

定義第一個文件的key值等於整行內容 a[$2]=$0     ====>>    a[000001] = 張三|000001

然后在執行第二個文件時用這個key進行取值a[$1](因為我們事先定義好的$1就是000001)

最后把文件2中剩下的內容進行拼接

{print a[$1] FS $2}

所以就有了上面的結果!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM