AWK如何取消条件

时间:2019-05-01 17:39:05

标签: 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。我在做什么错了?

2 个答案:

答案 0 :(得分:3)

您要尝试使用Shell方式进行操作,awk可以让您继续检查元素是否为数组的一部分,请尝试执行一次。

printf 'a\nb\na\nc\nb\na\n' | awk '
    !seen[$0]++ {
        order[o++] = $0
    }
END {
    for (i=0; i<o; i++)
        printf "%s\n", order[i]
}'

这里!seen[$0]++表示正在检查条件,如果元素不是名为a的数组索引的一部分,然后进入BLOCK(提供下一条语句的位置)内,然后进行{{1 }},以确保此元素(在检查条件之前未在数组中存在)的计数器增加1,这样,下次!seen [$ 0] ++`条件对于已传递的元素而言不是TRUE。

答案 1 :(得分:1)

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

# 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

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