我试图用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。我在做什么错了?
答案 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的绑定更紧密)