書(shū)上說(shuō):
NR,表示awk開(kāi)始執(zhí)行程序后所讀取的數(shù)據(jù)行數(shù).
FNR,與NR功用類似,不同的是awk每打開(kāi)一個(gè)新文件,FNR便從0重新累計(jì).
下面看兩個(gè)例子:
1,對(duì)于單個(gè)文件NR 和FNR 的 輸出結(jié)果一樣的 :
# 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,但是對(duì)于多個(gè)文件 :
# 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
在看一個(gè)例子關(guān)于NR和FNR的典型應(yīng)用:
現(xiàn)在有兩個(gè)文件格式如下:
#cat account 張三|000001 李四|000002 #cat cdr 000001|10 000001|20 000002|30 000002|15
想要得到的結(jié)果是將用戶名,,賬號(hào)和金額在同一行打印出來(lái),如下:
張三|000001|10 張三|000001|20 李四|000002|30 李四|000002|15
執(zhí)行如下代碼
#awk -F \| 'NR==FNR{a[$2]=$0;next}{print a[$1]"|"$2}' account cdr
注釋:
由NR=FNR為真時(shí),判斷當(dāng)前讀入的是第一個(gè)文件account,然后使用{a[$2]=$0;next}循環(huán)將account文件的每行記錄都存入數(shù)組a,并使用$2第2個(gè)字段作為下標(biāo)引用.
由NR=FNR為假時(shí),判斷當(dāng)前讀入了第二個(gè)文件cdr,然后跳過(guò){a[$2]=$0;next},對(duì)第二個(gè)文件cdr的每一行都無(wú)條件執(zhí)行{print a[$1]"|"$2},此時(shí)變量$1為第二個(gè)文件的第一個(gè)字段,與讀入第一個(gè)文件時(shí),采用第一個(gè)文件第二個(gè)字段$2為數(shù)組下標(biāo)相同.因此可以在此使用a[$1]引用數(shù)組,。
|