如何"回滚"一个getline电话?

时间:2017-10-25 12:33:12

标签: awk getline gawk

如果我在我的awk脚本中使用getline,它会从流中读取下一行并更新$ 0和NR变量(应该如此)。有没有办法解开 - getline

例如,我想使用getline来确定EOF,然后对其采取措施。但如果条件为假(即不是EOF),则脚本应该正常继续。

#!/bin/gawk -f

{
    print $0;

    if (getline == 0)
    {
        print "EOF";
    } else {
        ungetline;
    }
}

如果没有ungetline,上面的脚本将只打印每隔一个输入行。

可以使用while()构造包装整个脚本体,但是对于这一次使用,撤消操作更简洁。

1 个答案:

答案 0 :(得分:1)

不确定您要解决的问题,例如,要在输入的最后一行之前打印一行,您可以按照"延迟打印"方法。在这里它只是打印线,但任何处理都可以类似地添加。

$ seq 5 | awk 'NR>1 {print line} 
                    {line=$0} 
               END  {print "and finally..."; print line}'

1
2
3
4
and finally...
5

根据您更新的帖子,也许您的用例只是模拟END块。

$ seq 5 | awk '{print $1*$1} 
           END {print "EOF"}'

1
4
9
16
25
EOF

要么在最后一行之前或最后一次之后做某事;这些脚本都涵盖了这两种情况。你也可以将这两者结合起来。我还不确定你的用例......