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


getline 读入下一行并递增 NR 反击1.使用后 getlineawk 继续使用下一行。在大多数情况下,这是期望的行为。

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

我怎样才能回溯一行 awk?我试过设置 NR 手动计数器 NR=NR-1 但这不起作用。或者是否有一种方法只能在不改变的情况下查看下一行 NR

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

所有行匹配的规则集 /% file:/ 当我已经用getline读取这一行时,没有使用。这就是我想重置的原因 NR 然后到上一行 awk 会读取匹配的行 /% file:/ 再次,将执行适当的规则。


4366
2018-04-19 16:42


起源

我开发了一种名为TXR的文本混合语言,它在线性导向(“垂直”)和字符导向(“水平”)匹配模式中具有模式匹配和隐式回溯。前瞻深度是任意数量的字符或行。 TXR几乎是处理文字编程符号的理想选择。很难给出直接相关的例子;你能发布一个完整的文字符号规范吗? - Kaz


答案:


这可能接近你正在寻找的东西,不应该像你一样昂贵 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 在这种情况下)。

看到 这个 了解一些其他信息。


11
2018-04-20 00:56



惭愧,这似乎是GNU awk特有的。 - 0xC0000022L
@ 0xC0000022L:它对我有用 mawk。 - Dennis Williamson


这是一个黑客攻击并且相当昂贵,但对于小文件确实可以让你前瞻:

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

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


1
2018-04-19 17:01