解释此重复行删除,订单保留,单行AWK命令

时间:2012-05-31 22:25:28

标签: unix command-line awk

我学会了一种非常方便的方法来删除保留 Remove duplicates without sorting file - BASH 订单的重复行。

说,如果您有以下文件,

$cat file
a
a
b
b
a
c

您可以使用以下内容删除重复的行:

$awk '!x[$1]++' file
a
b
c

这如何在操作优先级方面起作用?

2 个答案:

答案 0 :(得分:22)

表达式被解析为

!(x[$(1)]++)

所以,从内到外,它是:

  • 获取当前输入行{1}的字段1(请注意,$(1)是AWK中的运算符,与Perl不同)。
  • 索引$,其值为字段1;如果x是未绑定的变量,请将其绑定到新的关联数组。
  • 增加后x;与C中的规则类似的规则适用,因此表达式的值是增量前x[$(1)]的值,如果x[$(1)]尚未赋值,则该值为零。
  • 否定前一个值,当x[$(1)]为零时,将产生真值。
  • 实际上执行增量以使x[$(1)]获得非零值。因此,下次x[$(1)]相同的x[$(1)]值将返回1.

然后对输入中的每一行计算此表达式,并确定是否应执行隐含的$(1)默认操作,即将该行回显到awk

答案 1 :(得分:0)

在AWK数组中是关联的,因此每行的第一列或第一个字段$1用作数组x的索引。