awk处理重复行错误分析
[root@localhost ~]#cat 0712 YRSD2-1-11 YRSD2-2-18 YRSD1-1-8 YRSD1-1-18 YRSD1-1-20 YRSD1-1-25 YRSD1-2-38 YRSD1-2-39 YRSD1-2-44 YRSD1-2-48 YRSD1-2-43 YRSD1-3-58 YRSD1-3-59 YRSD1-4-67 YRSD1-4-68 YRSD1-4-70 YRSD1-4-71 YRSD1-3-52 YRSD4-1-5 YRSD3-1-7 YRSD3-1-22 YRSD3-1-28 YRSD3-2-37 YRSD3-2-50 YRSD3-2-53 YRSD3-2-55 YRSD6-1-1 YRSD6-1-5 YRSD6-1-15 YRSD6-2-28 YRSD6-2-32 YRSD6-2-36 YRSD5-1-7 YRSD5-1-22 YRSD5-1-23 YRSD5-1-24 YRSD5-1-25 YRSD5-1-26 YRSD5-2-33 YRSD5-2-37 YRSD5-2-42 YRSD5-2-51 YRSD5-2-54 YRSD5-2-53 YRSD1-1-18 YRSD1-2-38 YRSD1-2-44 YRSD1-2-48 YRSD1-4-67 YRSD1-4-68 YRSD2-1-11 YRSD2-2-18 YRSD3-1-22 YRSD3-1-28 YRSD5-1-22 YRSD5-1-25 YRSD5-2-37 YRSD5-2-42 YRSD5-2-54 YRSD6-1-1 YRSD6-1-15
想将重复的行打印出来,结果搞错了,闲来无聊想想为什么会有这样的结果,算是对awk的加深印象
[root@localhost ~]#awk 'a[$0]++{for(i in a)print i,a[i]}' 0712 | wc -l 810
解析
a[$0]++结果为真时,执行action,所以第一遍不重复的时候,将数组存储
然后每次遇到重复的行,pattern结果为真,执行一次action,一共18个重复行,执行18次,每次结果为45行,共计45*18=810行
顺序对结果也有影响,对计数有影响
[root@localhost ~]#awk '++a[$0]{for(i in a)print i,a[i]}' 0712 | wc -l 1845
解析
因为++a[$0]第一次就有结果了,所以第一次就将a[第一行]打印出来,
第二行时,将第一行、第二行打印出来
第三行时,将第一二三行打印出来
以此类推
不重复行为45行
所以结果为45*(1+45)/2=1035
从第46行开始重复,且每次打印时数组均为45项,即45*18=810
1035+810=1845
over
[root@localhost ~]#awk 'a[$0]++;END{for(i in a)print i,a[i]}' 0712 | wc -l 63
awk只执行pattern对空间的内容没有影响,所以使用END模块也就没有效果
百度百科awk
其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号 ({}) 不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。
所以正确的END模式如下:
[root@localhost ~]#awk '{a[$0]++};END{for(i in a)print i,a[i]}' 0712 | wc -l 45
"世界上只有一种真正的英雄主义,就是认清了生活的真相后,还依然执着地热爱它。"
——罗曼·罗兰