关联数组如何在awk中工作?

时间:2013-03-14 19:32:34

标签: awk

我想根据列删除文件中的重复行。快速搜索让我this page有以下解决方案:

awk '!x[$1]++' filename

它有效,但我不确定它是如何工作的。我知道它在awk中使用了关联数组,但我无法推断除此之外的任何内容。

更新

感谢大家的解释。凭借我的新知识,我写了一篇blog post,并进一步解释了它是如何运作的。

1 个答案:

答案 0 :(得分:3)

awk脚本!x[$1]++填充名为x的数组。假设文本行中的第一个单词($1引用文本行中的第一个单词)为line1。它有效地在阵列上产生了这个操作:

x["line1"]++

数组的“索引”(键)是文件中遇到的文本(本例中为line1),与该键关联的值是一个增加1的整数。 p>

当遇到唯一的文本行时,数组的当前值为零,然后后递增为1. not运算符!求值为非零(true)对于每个新的独特文本行,所以打印它。下次遇到相同的值时,数组中的值不为零,因此not操作导致零(false),因此不会打印该行。

一种不那么“聪明”的方式来写同样的东西(但可能更清晰,更有趣)就是:

{
if (x[$1] == 0 ) 
   print
x[$1]++
}