shell脚本不排序去重

一条命令搞定:


awk '!a[$0]++' file



如果是第一次出现a[$0]++的值为0(假),而!a[$0]++的值就为1(真),之后就执行print $0

第二次或者两次以上的出现a[$0]++的值就为大于0的整数值(真),例如1,2,3...,而!a[$0]++的值就为0(假),之后就不执行print $0操作



awk '!($0 in a){a[$0];print $0}'

pattern为!($0 in a),Action为{a[$0];print $0}


分析:

1.执行第一行时的a的数组为空,($0 in a)为假,!($0 in a)为真。执行Action,a[$0]就存在了a[row1],打印第一行

2.执行第二行时的a的数组为a[row1],如果a[row2] 是a[$0]中的元素,!($0 in a)为真为假,不执行Ation。如果a[row2]不是a[$0]中的元素,执行Action,a[$0]中增加元素(a[row1],a[row2]),打印第二行。

3.重复执行类似的第二步骤。达到的去重的效果。

此种去重结果为整个文本没有重复项。


解释下
awk '!a[$0]++' file

一看之下,首先是想到又用到awk的hash,又是缺省的pattern,一下子来了兴趣,做了以下的分析

这个要从awk的执行模式开始说,最后结合++运算符,和hash特色
有三个基本知识点是要了解的
1:a++的作用是先附值,再累加a,与++a正好相反。

2:hash的初始是undef,通过直接赋值或声明进行定义,如a[1]=1,或直接声明a[1]。

3:awk的基本模式是,pattern   { action statements },action部分是可以省略的,缺省情况下是输出,即{print $0},至于pattern可以理解成是表达式,通过pattern表达式的值的真假,来确定是否要进行action。比如1,最简单的awk用来实现cat的功能就是 awk '1',这边1就是pattern,当然,1也可以是2,3,4,5等其他数字,但如果用字母的话,就不行,因为字母会解释成变量,变量初始值未定义,初始值为假,或者可以加个!反义

结合上边三点来分析awk '!a[$0]++' file
"!a[$0]++"

0:整个模式,没有用到action,所以采用的是默认的{print $0},即在patten为真条件来,输出行
patten分析:
1:使用了一个hash数组,a,数组的键值采用$0,即每行值
2:当a[$0]未声明时,a[$0]为假,在未声明的情况下,进行一次a[$0]++后,a[$0]即为真
3:!取反
结论:当相同的行第一次读入时,pattern为真,行输出,再次读入后,patten为假,行乎略

基本理论知道了,要用得出来还得多锻炼应用

上周帮别人写个awk,也是这种情况
我写的
awk '{if($2 in a);else{a[$2]=$0}}END{for(b in a)print a[b]}' urrfile

后来别人给出更简单的答案
awk ' !($2 in i){ i[$2]; print } ' urrfile

现在看来,还可以更简单些
awk '!a[$2]++' urrfile


     #To get missed_strings.txt which /values-xxx exist but /values does
not exist
     ./vendor/jrdcom/build/jrdtools/stringtool/prebuilt/stringtool.sh -v
-i ./vendor/jrdcom/build/common/string_res.ini -p ./ >> ./OriMissStrings.txt
     grep -v "Language" ./OriMissStrings.txt >> ./temp_del_lan.txt
     cat temp_del_lan.txt | tr -d "[" | tr -d "]" | tr -d "{" | tr -d
"}" >> ./temp_del_char.txt
     awk '!a[$0]++' ./temp_del_char.txt >> ./missed_strings.txt
     rm ./temp_del_lan.txt ./temp_del_char.txt

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值