歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> AWK的NR和FNR詳解

AWK的NR和FNR詳解

日期:2017/3/1 10:22:09   编辑:Linux編程

書上說:

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]引用數組。

Copyright © Linux教程網 All Rights Reserved