使用范围模式如何在范围内检测EOF?

时间:2018-04-10 17:50:46

标签: awk gawk

我想检测一下案例:我在其中找到我的范围的结尾。鉴于此awk命令:

 awk '/^START/,/^STOP/ { print $1,$2 }'  x.dat 

和这个数据:

garb
START d1
stuff d2
STOP d3
garb
START d1

如何检测到第二次 START后面没有停止?原因是错误检测。当检测到这种情况时,我想“发出”某种错误信号。

2 个答案:

答案 0 :(得分:1)

永远不要使用范围表达式,因为它们使得琐碎的任务变得非常简单,但是更有趣的是需要重复条件或完全重写。而不是:

awk '/^START/,/^STOP/ { print $1,$2 }' x.dat 
你应该写的:

awk '/^START/{f=1} f{ print $1,$2 } /^STOP/{f=0}' x.dat

然后您的新要求可能只需要:

awk '/^START/{f=1} f{ print $1,$2 } /^STOP/{f=0} END{if (f) print "The sky is falling!"}' x.dat

如果没有更多细节和具体的样本输入/输出进行测试,那就是我能做的最好的......

答案 1 :(得分:0)

这取决于你想做什么。您可以查看输出并查看最后一行是否与“STOP”匹配。如果您想在awk内检测到它,可以执行以下操作:

awk '/^START/,/^STOP/ { print $1,$2; a=1 } /^STOP/{a=0} 
    END{ if(a) { 
      # condition detected
     }}' 

但目前还不清楚你想做什么。