看看下一行,但不要消耗它

时间:2012-04-19 16:42:35

标签: awk gawk

getline读取下一行,并将NR计数器增加1.使用getline后,awk恢复使用下一行。在大多数情况下,这是期望的行为。

在我的特殊情况下,我只需要查看下一行,根据其内容,我会阅读下一行,或者我需要回溯一行。

如何在awk中回溯一行?我尝试将NR计数器手动设置为NR=NR-1,但这不起作用。或者是否有一种只查看下一行而不更改NR

的方法

我需要前瞻一行。简单地将行保存在变量中并在以后引用它在这种情况下不起作用。我正在尝试在awk中实现一个有文化的编程工具,其中主文件可能包含许多子文件。这样的子文件以"% file:file1"之类的行开头。如果达到较低缩进的行或其他行(如"% file:file2"行),则会到达此类文件的结尾。

当我已经使用getline读取此行时,不使用匹配/% file:/的所有行的规则集。这就是为什么我要将NR重置为上一行,然后awk会再次读取与/% file:/匹配的行,并执行相应的规则。

2 个答案:

答案 0 :(得分:11)

这可能接近您正在寻找的内容,并且不应该像sed解决方案那样昂贵,因为AWK维护了指向getline打开的文件的指针。

awk 'FNR == 1 {
         getline nextline < FILENAME
     }
     {
         getline nextline < FILENAME;
         print "currentline is:", $0;
         print "nextline is:   ", nextline
     }' input file

第一个块读取第一行并浪费它。

在此表单中,getline不会设置任何变量,例如NRFNRNF$0。它只设置您提供的变量(在这种情况下为nextline)。

有关其他信息,请参阅this

答案 1 :(得分:1)

这有点像黑客并且相当昂贵,但对于小文件确实可以让你前瞻:

cmd="sed -n " NR + 1 "p " FILENAME; cmd | getline nextline

这将获取NR的当前值并使用sed从输入文件中提取行NR + 1。这很昂贵,因为sed会在每次你做一次预测时读取整个文件(你可以通过向sed添加一个&q;&#39;命令来缓解这一点)。变量nextline将设置为文件的下一行,并在最后一行显示为空白。