awk之getline
欲要了解getline,首先需要搞清楚$0,NR,FNR这几个概念。
所谓NR可以理解成Number of Record,或者说是行号,而FNR可以理解为Number of Record in File,或者成为文件内行号.听起来没啥区别。实际上如果你只有一个文件要awk处理,NR和FNR就是一回事,如下面所示,同一个文件bbs-list-3,对于每一行输出的NR和FNR是相同的。
manu@manu:~/code/shell/awk$ cat bbs-list-3
aardvark 555-5553 1200/300 B
alpo-net 555-3412 2400/1200/300 A
barfly 555-7685 1200/300 A
manu@manu:~/code/shell/awk$ awk '{printf "%-2d %-2d %s\n",NR,FNR,$0 }' bbs-list-3
1 1 aardvark 555-5553 1200/300 B
2 2 alpo-net 555-3412 2400/1200/300 A
3 3 barfly 555-7685 1200/300 A
但是如果你有多个文件要处理,情况就不同了。NR不管你是位于那个文件,每读一行NR++,但是如果处理的文件发生了变化,FNR从1开始重新计数,如下图所示:
Effective awk programming中,给出了个表格,将awk的用法总结了如下:
什么意思呢,我们以几个例子来讲述getline的用法,以及解释输出为何是这样:首先我们的基准文件是:
1 getline
我们看下上面的table,getline会将得到的下一条record赋给$0,同时NR,FNR都会++。
2 getline var
这个对应的是table的第二条,getline var,会将取到的下一条record赋值给 var,NR++,FNR++,而$0不发生任何的变化。
看下图,每次取到下一条record,赋值给tmp,而$0,从未发生变化,因为getline var 这种模式,从不改变$0.
3 command | getline
表格里面显示,会影响$0,将执行command的结果赋值给$0,复制我们可以用下面的例子展示下:
4 command | getline var
这个不多说了,会将command的输出赋值给var,而$0保持不变。
查看更多关于awk之getline - Linux操作系统:Ubuntu_Centos_Debian - 自学的详细内容...