14

getline读入下一行并将NR计数器加 1。使用 后getlineawk恢复下一行的工作。在大多数情况下,这是所需的行为。

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

我怎样才能回溯一行awk?我尝试NR手动将计数器设置为,NR=NR-1但这不起作用。或者有没有一种方法只看下一行而不改变NR

我需要一条线的前瞻。在这种情况下,简单地将行保存在变量中并稍后引用它是行不通的。我正在尝试在其中实现一个识字编程工具awk,其中一个主文件可能包含许多子文件。这样的子文件以类似"% file:file1". 如果到达具有较低缩进的行或具有类似行的另一行,则到达此类文件的末尾"% file:file2"

/% file:/当我已经用 getline 阅读了这一行时,不使用所有行匹配的规则集。这就是为什么我想重置NR到上一行,然后awk再次读取匹配的行/% file:/并执行适当的规则。

4

2 回答 2

13

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

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

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

在这种形式中,getline不设置任何变量,例如NR、或。它只设置您提供的变量(在这种情况下)。FNRNF$0nextline

有关其他信息,请参阅此内容。

于 2012-04-20T00:56:59.467 回答
1

这有点 hack 并且相当昂贵,但是对于小文件确实可以让您提前了解:

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

这将采用 NR 的当前值并使用 sed 从输入文件中提取行 NR + 1。这很昂贵,因为 sed 会在您每次进行前瞻时读取整个文件(您可以通过向 sed 添加“q”命令来稍微缓解这种情况)。变量 nextline 将设置为文件的下一行,并且在最后一行为空白。

于 2012-04-19T17:01:27.273 回答