使用范围模式如何检测范围内的 EOF?
Using a range pattern how does one detect EOF within the range?
我想检测这种情况:我没有找到范围的终点。鉴于此 awk
命令:
awk '/^START/,/^STOP/ { print , }' x.dat
和此数据:
garb
START d1
stuff d2
STOP d3
garb
START d1
如何检测 second START 后没有 STOP?这样做的原因是错误检测。我想 "signal" 检测到某种错误。
这取决于你想做什么。您可以查看输出并查看最后一行是否匹配 'STOP'。如果你想在 awk
内检测到它,你可以这样做:
awk '/^START/,/^STOP/ { print ,; a=1 } /^STOP/{a=0}
END{ if(a) {
# condition detected
}}'
但是不太清楚你想做什么。
切勿使用范围表达式,因为它们会使琐碎的任务变得非常简单,但任何更有趣的任务都需要重复条件或完全重写。而不是:
awk '/^START/,/^STOP/ { print , }' x.dat
你应该写:
awk '/^START/{f=1} f{ print , } /^STOP/{f=0}' x.dat
然后您的新要求可能只需要:
awk '/^START/{f=1} f{ print , } /^STOP/{f=0} END{if (f) print "The sky is falling!"}' x.dat
没有更多细节和特定样本 input/output 进行测试,那是我能做的最好的....
我想检测这种情况:我没有找到范围的终点。鉴于此 awk
命令:
awk '/^START/,/^STOP/ { print , }' x.dat
和此数据:
garb
START d1
stuff d2
STOP d3
garb
START d1
如何检测 second START 后没有 STOP?这样做的原因是错误检测。我想 "signal" 检测到某种错误。
这取决于你想做什么。您可以查看输出并查看最后一行是否匹配 'STOP'。如果你想在 awk
内检测到它,你可以这样做:
awk '/^START/,/^STOP/ { print ,; a=1 } /^STOP/{a=0}
END{ if(a) {
# condition detected
}}'
但是不太清楚你想做什么。
切勿使用范围表达式,因为它们会使琐碎的任务变得非常简单,但任何更有趣的任务都需要重复条件或完全重写。而不是:
awk '/^START/,/^STOP/ { print , }' x.dat
你应该写:
awk '/^START/{f=1} f{ print , } /^STOP/{f=0}' x.dat
然后您的新要求可能只需要:
awk '/^START/{f=1} f{ print , } /^STOP/{f=0} END{if (f) print "The sky is falling!"}' x.dat
没有更多细节和特定样本 input/output 进行测试,那是我能做的最好的....