awk之getline


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保持不变。
 

相关内容

    暂无相关文章