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
程序。谢谢