getline
读取下一行,并将NR
计数器增加1.使用getline
后,awk
恢复使用下一行。在大多数情况下,这是期望的行为。
在我的特殊情况下,我只需要查看下一行,根据其内容,我会阅读下一行,或者我需要回溯一行。
如何在awk
中回溯一行?我尝试将NR
计数器手动设置为NR=NR-1
,但这不起作用。或者是否有一种只查看下一行而不更改NR
?
我需要前瞻一行。简单地将行保存在变量中并在以后引用它在这种情况下不起作用。我正在尝试在awk
中实现一个有文化的编程工具,其中主文件可能包含许多子文件。这样的子文件以"% file:file1"
之类的行开头。如果达到较低缩进的行或其他行(如"% file:file2"
行),则会到达此类文件的结尾。
当我已经使用getline读取此行时,不使用匹配/% file:/
的所有行的规则集。这就是为什么我要将NR
重置为上一行,然后awk
会再次读取与/% file:/
匹配的行,并执行相应的规则。
答案 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
不会设置任何变量,例如NR
,FNR
,NF
或$0
。它只设置您提供的变量(在这种情况下为nextline
)。
有关其他信息,请参阅this。
答案 1 :(得分:1)
这有点像黑客并且相当昂贵,但对于小文件确实可以让你前瞻:
cmd="sed -n " NR + 1 "p " FILENAME; cmd | getline nextline
这将获取NR的当前值并使用sed从输入文件中提取行NR + 1。这很昂贵,因为sed会在每次你做一次预测时读取整个文件(你可以通过向sed添加一个&q;&#39;命令来缓解这一点)。变量nextline将设置为文件的下一行,并在最后一行显示为空白。