6

awk用于在输出文件中格式化输入文件。我有几种模式来填充变量(例如示例中的“某些模式”)。这些变量以块中所需的格式打印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至少会执行该块。有什么办法可以捕捉到exit类似的东西:

if (!exit_invoked) {
    print var
}

或其他方式避免在END块中打印输出?

斯特凡

编辑:使用了 shellter 的解决方案。

4

3 回答 3

8

您必须通过在行exit_invoked前设置来明确处理它exit,即

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
    }
}

我希望这有帮助。

于 2012-04-12T17:47:02.183 回答
0
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.

      ......
于 2016-04-21T12:19:39.813 回答
0

作为短语法的粉丝并试图避免徒劳{}的 s 或稍后将它们添加到预先存在的程序中,而不是:

...
    else {
        exit_invoked=1
        exit 1
    }
...
END {
    if (! exit_invoked  ) {
        print var
    }
}

我用:

    else 
        exit (e=1)            # the point
...
END {
    if(!e)
        print v
}
于 2020-05-27T12:36:12.353 回答