• 解析awk ‘!a[$0]++’去重功能

    发布时间:2020-03-21 23:35:22
    作者:ynkulusi
  • 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
    省略掉后面的{print $0}
    awk '!a[$0]++' a.txt
    111
    222
    333
  • 分类:awk
    标签: awk 去重
    评论数:0 阅读数:869