書上說:
NR,表示awk開始執行程序後所讀取的數據行數.
FNR,與NR功用類似,不同的是awk每打開一個新文件,FNR便從0重新累計.
下面看兩個例子:
1,對於單個文件NR 和FNR 的 輸出結果一樣的 :
# awk '{print NR,$0}' file1
1 a b c d
2 a b d c
3 a c b d
#awk '{print FNR,$0}' file1
1 a b c d
2 a b d c
3 a c b d
2,但是對於多個文件 :
# awk '{print NR,$0}' file1 file2
1 a b c d
2 a b d c
3 a c b d
4 aa bb cc dd
5 aa bb dd cc
6 aa cc bb dd
# awk '{print FNR,$0}' file1 file2
1 a b c d
2 a b d c
3 a c b d
1 aa bb cc dd
2 aa bb dd cc
3 aa cc bb dd
在看一個例子關於NR和FNR的典型應用:
現在有兩個文件格式如下:
#cat account
張三|000001
李四|000002
#cat cdr
000001|10
000001|20
000002|30
000002|15
想要得到的結果是將用戶名,帳號和金額在同一行打印出來,如下:
張三|000001|10
張三|000001|20
李四|000002|30
李四|000002|15
執行如下代碼
#awk -F \| 'NR==FNR{a[$2]=$0;next}{print a[$1]"|"$2}' account cdr
注釋:
由NR=FNR為真時,判斷當前讀入的是第一個文件account,然後使用{a[$2]=$0;next}循環將account文件的每行記錄都存入數組a,並使用$2第2個字段作為下標引用.
由NR=FNR為假時,判斷當前讀入了第二個文件cdr,然後跳過{a[$2]=$0;next},對第二個文件cdr的每一行都無條件執行{print a[$1]"|"$2},此時變量$1為第二個文件的第一個字段,與讀入第一個文件時,采用第一個文件第二個字段$2為數組下標相同.因此可以在此使用a[$1]引用數組。