awk NR,FNR,next
07 May 2012NR,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 |
# 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 |
现在有两个文件格式如下:
#cat account
张三|000001
李四|000002
cat cdr000001|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 |
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