awk:catch`exit';在最后一个街区
我正在使用awk:catch`exit';在最后一个街区,awk,Awk,我正在使用awk在输出文件中格式化输入文件。我有几个填充变量的模式(比如示例中的“some pattern”)。这些变量以所需格式打印在END块中。输出必须在那里进行,因为不能保证输入文件中的出现顺序,但输出文件中的顺序必须始终相同 BEGIN { FS = "=|," } /some pattern/ { if ($1 == 8) { var = $1 } else { # Incorrect field value
awk
在输出文件中格式化输入文件。我有几个填充变量的模式(比如示例中的“some pattern”)。这些变量以所需格式打印在END
块中。输出必须在那里进行,因为不能保证输入文件中的出现顺序,但输出文件中的顺序必须始终相同
BEGIN {
FS = "=|,"
}
/some pattern/ {
if ($1 == 8) {
var = $1
} else {
# Incorrect field value
exit 1
}
}
END {
# Output the variables
print var
}
所以我的问题是模式中的exit
语句。如果出现错误并且调用了此命令,则应该根本没有输出,或者最多有一条错误消息。但是正如gawk手册()所说,如果在模式块中调用exit
命令,则至少会执行END
块。有没有什么方法可以抓住退出
的机会,比如:
if (!exit_invoked) {
print var
}
或者以其他方式避免在END
块中打印输出
斯特凡
edit:使用了Shelleter提供的解决方案。您必须在
退出
行之前设置退出
来显式处理它,即
BEGIN {
FS = "=|,"
}
/some pattern/ {
if ($1 == 8) {
var = $1
} else {
# Incorrect field value
exit_invoked=1
exit 1
}
}
END {
if (! exit_invoked ) {
# Output the variables
print var
}
}
我希望这会有所帮助。是一个简短语法的爱好者,并试图避免无用的
{}
或以后将它们添加到现有程序中,而不是:
END {
# If here from a main block exit error, it is unlikely to be at EOF
if (getline) exit
# If the input can still be read, exit with the previously set status rather than run the rest of the END block.
......
...
else {
exit_invoked=1
exit 1
}
...
END {
if (! exit_invoked ) {
print var
}
}
我使用:
else
exit (e=1) # the point
...
END {
if(!e)
print v
}
谢谢,不要考虑这个简单的解决方案;)我将把它打包在一个函数中,以避免忘记调用的
exit\u
集。Stefan@Stefan:好主意。作为提醒,您可能需要在BEGIN块中设置该变量,即exit\u invoked=0
。有些人会抱怨这是不必要和多余的。我自己不会这么做,但这是一个很好的自我记录技术。YRMV。祝你好运。我会这么做的,因为我不会为自己编写awk
程序。谢谢