awk技巧-!a[$0]++
来源:互联网 发布:软件项目启动通知单 编辑:程序博客网 时间:2024/06/05 21:54
转载自:http://www.51testing.com/html/87/363787-811057.html
解释下
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
【注意】:这是前加/后加的区别,前几天还说过。
后加: 先使用变量的值,再自加。
!a[$0]++ 对这个表达式的求值,它的值与 !a[$0] 相同(先使用变量a[$0]的值),但对表达式求值后 a[$0]会自加。
- awk技巧-!a[$0]++
- awk技巧
- awk技巧
- awk应用技巧
- awk 使用技巧
- awk常用技巧
- awk用法技巧
- awk使用技巧
- awk 使用技巧
- AWK 使用技巧总结
- awk技巧总结
- awk工作常用技巧
- AWK 使用技巧
- sed与awk技巧备忘
- 技巧:AWK 关联数组的一个应用
- awk中表示地址的小技巧
- 用awk一些常用技巧sort uniq
- awk 使用技巧: 匹配部分元素
- 【转】UTF-8 GB18030 GBK GB2312区别
- linux架构
- js实现用自符串替换占位符{0} {1} {2} 等
- Apache+php+mysql在windows下的安装与配置图解
- android 电容屏(四):驱动调试之驱动程序分析篇 -- FocalTech
- awk技巧-!a[$0]++
- java之创建自定义类数组
- 微软正在寻找cookie的代替品
- 小数点后的位数个数
- Android 中多点触摸协议
- Qt modal & modalless
- loadrunner 小知识累积
- Web服务器父与子 Apache和Tomcat区别
- COM编程入门(一)