深入理解 awk ‘! a[$0]++’ 去重

深入理解 awk ‘! a[$0]++’ 去重

近期和同事回顾一下shell脚本,awk ‘! a[$0]++’ 去重复不太好理解?我整理了一下希望能帮助大家理解;

  • ”!” 即非;
  • a[$0],以$0为数据下标,建立数组a
  • a[$0]++,即给数组a赋值,a[$0]+=1,注意a++和++a的区别,a++是先输出值后加1
  • awk当pattern为1即为真时,执行action,此时action为空执行print $0
  • 在shell中没有赋值的变量默认是char类型是空值,后面有++后数组被定义为int型,初始值就为0
[root@VM_39_7_centos ~]# a=0
[root@VM_39_7_centos ~]# echo  "$a"
0
[root@VM_39_7_centos ~]# echo  $((a++))
0
[root@VM_39_7_centos ~]# echo $a
1
[root@VM_39_7_centos ~]# awk '{print a[$0],!a[$0]++,a[$0],!a[$0],$0}' file
 1 1 0 111
 1 1 0 222
 1 1 0 555
 1 1 0 333
1 0 2 0 111
1 0 2 0 222
 1 1 0 444
2 0 3 0 222
1 0 2 0 555
[root@VM_39_7_centos ~]# more file
111
222
555
333
111
222
444
222
555
[root@VM_39_7_centos ~]#
[root@VM_39_7_centos ~]# awk '!a[$0]++' file
111
222
555
333
444
[root@VM_39_7_centos ~]# 

说明:第一次a[$0]++当前值是0,然后0取返是1既可以输出结果,第二次遇到相同值时a[$0]是1,此时输出的a[$0]++也是1取返是0即不输出结果,同理类推;

猜你喜欢

转载自blog.csdn.net/qq_31555951/article/details/106616163