首页 > 代码库 > awk ‘! a[$0]++’ 去重

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]++’ 去重