getline
读入下一行并递增 NR
反击1.使用后 getline
, awk
继续使用下一行。在大多数情况下,这是期望的行为。
在我的特殊情况下,我只需要查看下一行,根据其内容,我会阅读下一行,或者我需要回溯一行。
我怎样才能回溯一行 awk
?我试过设置 NR
手动计数器 NR=NR-1
但这不起作用。或者是否有一种方法只能在不改变的情况下查看下一行 NR
?
我需要一行前瞻。简单地将行保存在变量中并在以后引用它在这种情况下不起作用。我正在尝试实现一个有文化的编程工具 awk
,主文件可能包含许多子文件。这样的子文件以一行开头 "% file:file1"
。如果一行具有较低的缩进或另一行具有一行,则到达此类文件的结尾 "% file:file2"
到达了。
所有行匹配的规则集 /% file:/
当我已经用getline读取这一行时,没有使用。这就是我想重置的原因 NR
然后到上一行 awk
会读取匹配的行 /% file:/
再次,将执行适当的规则。
这可能接近你正在寻找的东西,不应该像你一样昂贵 sed
解决方案,因为AWK维护一个指向文件的指针 getline
打开。
awk 'FNR == 1 {
getline nextline < FILENAME
}
{
getline nextline < FILENAME;
print "currentline is:", $0;
print "nextline is: ", nextline
}' input file
第一个块读取第一行并浪费它。
在这种形式, getline
没有设置任何变量,如 NR
, FNR
, NF
要么 $0
。它只设置您提供的变量(nextline
在这种情况下)。
看到 这个 了解一些其他信息。
这是一个黑客攻击并且相当昂贵,但对于小文件确实可以让你前瞻:
cmd="sed -n " NR + 1 "p " FILENAME; cmd | getline nextline
这将取NR的当前值并使用sed从输入文件中提取行NR + 1。这很昂贵,因为sed会在每次你做一个前瞻时读取整个文件(你可以通过向sed添加'q'命令来缓解这一点)。变量nextline将设置为文件的下一行,并在最后一行显示为空白。