awk中的getline的用法

来源:互联网 发布:form表单数据转json 编辑:程序博客网 时间:2024/04/30 17:42
NR与FNR:



QUOTE:
A.awk对多输入文件的执行顺序是,先将代码作用于第一个文件(一行行读入),然后该重复的代码又作用于第二个文件,再作用于第三个文件。
B.awk对多输入文件的执行顺序产生了行序号的问题。当第一个文件执行完,下次读入第二个文件,那么第二个文件的第一行怎么算呢?如果又计为1的话,那不就两个1了么?(因为第一个文件也有第一行)。这就是NR和FNR的问题。
   NR :全局行数(第二个文件的第一行接着第一个文件尾行数顺序计数)
   FNR:当前文件自身的行数(不考虑前几个输入文件的自身行数及总数)

         例如:data1.txt中有40行,data2.txt中有50行,那么awk ‘{}’ data1.txt data2.txt
                  NR  的值依次为:1,2……40,41,42……90
                   FNR的值依次为:1,2……40, 1, 2……50 

getline函数说明:



QUOTE:
A.getline从整体上来说,应这么理解它的用法:
            当其左右重定向符 | 或 < 时,getline作用于当前文件,读入当前文件的第一行给其后跟的变量 
            var 或$0(无变量);应该注意到,由于awk在处理getline之前已经读入了一行,所以getline得到
            的返回结果是隔行的。
            当其左右重定向符 | 或 < 时,getline则作用于定向输入文件,由于该文件是刚打开,并没有被
            awk读入一行,只是getline读入,那么getline返回的是该文件的第一行,而不是隔行。
B.getline用法大致可分为三大类(每大类又分两小类),即总共有6种用法。代码如下:



QUOTE:
nawk ‘BEGIN{“cat data.txt”|getline d; print d}’ data2.txt 
nawk ‘BEGIN{“cat data.txt”|getline; print $0}’ data2.txt
nawk ‘BEGIN{getline d < “data.txt”; print d}’ data2.txt 
nawk ‘BEGIN{getline < “data.txt”; print $0}’ data2.txt
      以上四行代码均实现“只打印data.txt文件的第一行”(若打印全部行,用循环)
eg. nawk ‘BEGIN{FS=”:”;while(getline<”/etc/passwd”>0){print $1}}’ data.txt



QUOTE:
nawk ‘{getline d; print d”#”$3}’ data.txt
              awk首先读入第一行,接着处理getline函数,然后把下一行指定给变量d,再先打印d,由于d后面有换行符,所以后面紧跟的#会覆盖d,后面的$3同样也会覆盖d。




QUOTE:
nawk ‘{getline; print $0”#”$3}’ data.txt
               awk首先读入第一行接着处理getline函数,然后把下一行指定给$0,现在的$0已经是下一行内容,后面的#和$3(从$0中取)会覆盖$0的内容。
0 0
原创粉丝点击