首页 > 解决方案 > awk 如何否定条件

问题描述

我试图在 awk 中计算一些东西,最后按输入的顺序打印结果。对于每一行,我检查它是否还没有被看到。如果没有,我将其添加到数组中并将其存储在order数组中。

{
    if (! $0 in seen) {
        seen[$0] = 1
        order[o++] = $0
    }
} END {
    for (i=0; i<o; i++)
        printf "%s\n", order[i]
}

你可以试试

printf 'a\nb\na\nc\nb\na\n' | awk script_above

它什么也不打印。如果我在最后打印变量o,它表明它的值仍然是 0。我做错了什么?

标签: awk

解决方案


您只需要添加括号即可获得正确的运算符优先级*:

# a.awk

{
    if (!($0 in seen)) {
        seen[$0] = 1
        order[o++] = $0
    }
}

END {
    for (i=0; i<o; i++)
        printf "%s\n", order[i]
}

测试:

$ awk -f a.awk file
a
b
c

*(一元!比运算符绑定更紧密inhttps ://www.gnu.org/software/gawk/manual/html_node/Precedence.html )


推荐阅读