1

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

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

它可以工作,但我不确定它是如何工作的。我知道它使用关联数组,awk但我无法推断出它以外的任何东西。

更新

谢谢大家的解释。凭借我的新知识,我写了一篇博客文章,进一步解释了它是如何工作的。

4

1 回答 1

3

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

x["line1"]++

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

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

写同一件事的一种不太“聪明”的方式(但可能更清晰,更不有趣)是这样的:

{
if (x[$1] == 0 ) 
   print
x[$1]++
}
于 2013-03-14T19:42:57.403 回答