解析awk ‘!a[$0]++’ a.txt

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值