我想根据列从文件中删除重复的行。快速搜索让我这个页面有以下解决方案:
awk '!x[$1]++' filename
它可以工作,但我不确定它是如何工作的。我知道它使用关联数组,awk
但我无法推断出它以外的任何东西。
更新:
谢谢大家的解释。凭借我的新知识,我写了一篇博客文章,进一步解释了它是如何工作的。
该 awk 脚本!x[$1]++
填充了一个名为x
. 假设一行文本中的第一个单词($1
指一行文本中的第一个单词)是line1
。它有效地导致对数组进行此操作:
x["line1"]++
数组的“索引”(键)是文件中遇到的文本(line1
在本例中),与该键关联的值是一个加 1 的整数。
当遇到唯一的文本行时,数组的当前值为零,然后后递增为 1。not
运算符!
对每个新的唯一文本行计算为非零(真)并打印它。下次遇到相同的值时,数组中的值非零,因此not
运算结果为零(假),因此不打印该行。
写同一件事的一种不太“聪明”的方式(但可能更清晰,更不有趣)是这样的:
{
if (x[$1] == 0 )
print
x[$1]++
}