awk NR,FNR,next

NR,FNR

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]引用数组。<!-- more -->

next

遇到next时,读入下一行,然后从头开始处理,即next起到了{getline; goto head}的作用。 或者是: 在循环逐行匹配,如果遇到next,就会跳过当前行,直接忽略下面语句。而进行下一行匹配。 awk next使用实例:

要求: 文件:text.txt 格式: httpd            ok tomcat               ok sendmail               ok web02[192.168.2.101] httpd            ok postfix               ok web03[192.168.2.102] mysqld            ok httpd               ok 需要通过awk将输出格式变成: web01[192.168.2.100]:   httpd            ok web01[192.168.2.100]:   tomcat               ok web01[192.168.2.100]:   sendmail               ok web02[192.168.2.101]:   httpd            ok web02[192.168.2.101]:   postfix               ok web03[192.168.2.102]:   mysqld            ok web03[192.168.2.102]:   httpd               ok 分析: 分析发现需要将包含有“web”行进行跳过,然后需要将内容与下面行合并为一行。 $ awk '/^web/{T=$0;next;}{print T":\t"$0;}' test.txt web01[192.168.2.100]:   httpd            ok web01[192.168.2.100]:   tomcat               ok web01[192.168.2.100]:   sendmail               ok web02[192.168.2.101]:   httpd            ok web02[192.168.2.101]:   postfix               ok web03[192.168.2.102]:   mysqld            ok web03[192.168.2.102]:   httpd               ok

参考:1. 2.