將兩個文件具有相同列的行進行合並
[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}
所以就有了上面的結果!