awk ‘! a[$0]++’ 去重

Posted 陈浩然MC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了awk ‘! a[$0]++’ 去重相关的知识,希望对你有一定的参考价值。

awk ‘! a[$0]++’ 怎么理解?

 

这是一个非常经典的去重复项的awk语句,虽然短小,不过涉及到了不少知识点,下面一一解读:

<1> :”!” 即非。

<2>:a[$0],以$0为数据下标,建立数组a

<3>:a[$0]++,即给数组a赋值,a[$0]+=1

<4> :那么组合起来,awk是怎么执行!a[$0]++的呢?我用一个实际例子来解释:

cat file
111
222
111
222
333

awk ‘{print a[$0],!a[$0]++,a[$0],!a[$0],$0}‘ file
  1 1 0 111
  1 1 0 222
1 0 2 0 111
1 0 2 0 222
  1 1 0 333

  但pattern为1即为真时,执行action,此时action为空执行print $0

  由于执行了++,它的初值变成了0【执行++后数组被定义为int型,初始值就为0】

默认空char型变量未null,空int型变量为0

  第一次肯定是不同的行,所有不会有重复

  但遇到重复的行是,数组的下标相同,此时数组的value为0,执行++后,数组值为1,经取反后

  数组为0,action不执行【即不打印】

  

以上是关于awk ‘! a[$0]++’ 去重的主要内容,如果未能解决你的问题,请参考以下文章

awk实用语法

awk去重以某列重复的行

shell脚本,awk 根据文件某列去重并且统计该列频次。

awk数组计数和去重---统计域名访问次数

去重sort|uniq -d

如何计算bash中一列数据中的连续重复次数?