awk:在END块中捕获`exit'

时间:2012-04-12 17:31:59

标签: awk

我正在使用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手册(here)所说,如果在模式块中调用exit命令,则END块将至少执行。有没有办法赶上exit喜欢:

if (!exit_invoked) {
    print var
}

或其他一些方法可以避免在END块中打印输出?

的Stefan

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

3 个答案:

答案 0 :(得分:6)

你必须明确处理它,方法是在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
    }
}

我希望这会有所帮助。

答案 1 :(得分:0)

import pandas as pd

list(pd.DataFrame(d).dropna().index)

#['key_x', 'key_y']

答案 2 :(得分:0)

喜欢使用简短的语法,并尝试避免徒劳的{}或稍后将其添加到预先存在的程序中,而不是:

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

我使用:

    else 
        exit (e=1)            # the point
...
END {
    if(!e)
        print v
}