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不执行【即不打印】
"世界上只有一种真正的英雄主义,就是认清了生活的真相后,还依然执着地热爱它。"
——罗曼·罗兰