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

Sud*_*dar 3 awk

我想从基于列的文件中删除重复行。快速搜索让我找到了这个页面,其中有以下解决方案:

awk '!x[$1]++' filename
Run Code Online (Sandbox Code Playgroud)

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

更新

谢谢大家的解释。根据我的新知识,我写了一篇博客文章,进一步解释了它的工作原理。

Mar*_*ins 5

该 awk 脚本!x[$1]++填充一个名为 的数组x。假设一行文本中的第一个单词($1指一行文本中的第一个单词)是line1。它有效地导致了对数组的此操作:

x["line1"]++
Run Code Online (Sandbox Code Playgroud)

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

当遇到唯一的文本行时,数组的当前值为零,然后后递增为 1。对于每个新的唯一文本行,该not运算符!的计算结果为非零 (true),因此将其打印。下次遇到相同的值时,数组中的值非零,因此运算not结果为零 (false),因此不会打印该行。

编写相同内容的不太“聪明”的方式(但可能更清晰且不那么有趣)是这样的:

{
if (x[$1] == 0 ) 
   print
x[$1]++
}
Run Code Online (Sandbox Code Playgroud)