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

Alb*_*lby 14 unix awk command-line

我学会了一种非常方便的方法来删除保留订单的重复行,从删除重复项而不排序文件 - BASH.

比如说,如果您有以下文件,

$cat file
a
a
b
b
a
c
Run Code Online (Sandbox Code Playgroud)

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

$awk '!x[$1]++' file
a
b
c
Run Code Online (Sandbox Code Playgroud)

这在运营优先级方面如何运作?

Fre*_*Foo 22

表达式被解析为

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

所以,从内到外,它是:

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

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

  • 只是一个补充:`!x [$ 1] ++`是一个表达式,如果为真,将执行以下代码块.但是,它没有任何代码块; 在这种情况下,默认行为是执行`print`命令,如果没有给出参数,则打印当前行.这意味着,在这种情况下,`!x [$ 1] ++`相当于`!x [$ 1] ++ {print;}`.所以,第一行的一个值由`$(1)`返回,`!x [$ 1] ++`的结果为真,该行将打印出来; 但是,下一次,`!x [$ 1] ++`将产生错误,并且不会打印这些行. (11认同)