14

我学到了一种非常方便的方法来删除重复行,保留从Remove duplicates without sorting file - BASH中的顺序。

说,如果你有以下文件,

$cat file
a
a
b
b
a
c

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

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

这在操作优先级方面是如何工作的?

4

2 回答 2

22

表达式被解析为

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

所以,从内到外,它是:

  • 取当前输入行的字段 1,$(1)(注意这$是 AWK 中的运算符,与 Perl 不同)。
  • x具有字段 1 值的索引;如果x是未绑定变量,则将其绑定到新的关联数组。
  • 后增量x[$(1)];应用类似于 C 中的规则,因此表达式的值是在增量之前的值,如果尚未分配值x[$(1)],它将为零。x[$(1)]
  • x[$(1)]否定前一个的值,当为零时将产生真值。
  • 实际上做增量,以便x[$(1)]获得一个非零值。因此,下一次,x[$(1)]对于相同的值,$(1)将返回 1。

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

于 2012-05-31T22:36:19.237 回答
0

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

于 2015-12-01T21:21:38.667 回答