参考
10. awk ‘! a[$0]++’ 怎么理解?
这是一个非常经典的去重复项的awk语句,虽然短小,不过涉及到了不少知识点,下面一一解读:
<1> :”!” 即非。
<2>:a[$0],以$0为数据下标,建立数组a
<3>:a[$0]++,即给数组a赋值,a[$0]+=1
<4> :那么组合起来,awk是怎么执行!a[$0]++的呢?
即: '!a[$0]++' 当$0的内容首次出现时,a[$0]将为空(相当于0),
此时将先求!a[$0]的值(也是整个式子的值,即为非空 true ,将影响后续动作,执行默认的print)
然后对a[$0]进行+1,a[$0] 加1后为1,当下次出现时a[$0]即不为空,表达式结果为非真 false,即不打印
【追加】:关于运算顺序,出现在上面帖子的9L
“ 这是前加/后加的区别
后加: 先使用变量的值,再自加。
!a[$0]++ 对这个表达式的求值,它的值与 !a[$0] 相同(先使用变量a[$0]的值),但对表达式求值后 a[$0]会自加。 ”
同理,可针对某一列的数据重复情况进行处理,a[$1]等。
打印a[$0],!a[$0],!a[$0]++值
-
personball@vostro:~$awk '{print a[$0]}' test #未对a[$0]进行处理,a[$0]恒为空
-
-
-
-
-
-
-
-
personball@vostro:~$awk '{print !a[$0]}' test #取反
-
1
-
1
-
1
-
1
-
1
-
1
-
1
-
personball@vostro:~$awk '{print !a[$0]++}' test #自加操作,更改a[$0]的值
-
1 # 111 首次出现
-
1 # 222 首次出现
-
0 # 111 2次出现
-
0 # 222 2次出现
-
1 # 333 首次出现
-
0 # 111 3次出现
-
1 # 444 首次出现
-
personball@vostro:~$cat test
-
111
-
222
-
111
-
222
-
333
-
111
-
444
阅读(4498) | 评论(0) | 转发(0) |