awk ‘!a[$0]++’ a.txt 是awk ‘!a[$0]++ {print $0}’ a.txt的缩写,前面!a[$0]++是判断条件,{print $0}是要执行的结果
首先要理解a++和++a的不同
a++是先执行表达式后再自增,执行表达式时使用的是a的原值。
++a是先自增再执行表达示,执行表达式时使用的是自增后的a。
例:
int a=0
printf("%d",a++); //输出0,执行完后a=1
int a=0
printf("%d",++a);//输出1,执行完后a=1
以下以一个例子来说明,在理解!a[$0]++之前,我们先了解以下a[$0]++,$0在awk里面表示一个整行,数组a以一个整行作为下标及a[111],a[222],a[333]。
cat a.txt
111
222
111
222
333
111
222
执行命令 :
awk 'a[$0]++ {print $0}' a.txt
111
222
111
222
结果打印是重复出现的部分,第一次出现的部分没有打印,第二次及以后的部分都打印出来了,条件判断a[$0]++判断时,第一次输出结果是0,为错,所以第一次出现的行都不打印,等到相同的行再次出现时,结果都大于等于1,为对,所以都打印。
a[111]++,在第一行出现时,输出结果为0,a[111]++执行完后的的值为1,所以a[111]++在匹配第一次即第一行行出现的111时不打印,第二次和第三次打印,a[222]++和a[333]++同理。
接下来!a[$0]++就比较好理解了,它是a[$0]++的取反,也就是说第一次出现的行打印,第二次出现相同的行不打印。
执行命令
awk '!a[$0]++ {print $0}' a.txt
111
222
333