免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1471 | 回复: 1
打印 上一主题 下一主题

linux排重的方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-19 19:13 |只看该作者 |倒序浏览

linux排重的方法










     想必各位用linux的人都会碰到排重的问题,像查看一个日志文件,会碰到狠毒重复记录,看起来很痛苦。还有像grep一下关键字,想找出现关键字的文件,但是出现了一堆重复的文件名,也是一件郁闷的事情。

    下面给大家介绍两种linux排重的方法,一种是使用uniq命令,一种使用gawk。

     uniq排重

    uniq的作用是对相邻重复行进行排重处理,对无序的字符是没办法处理,所以需要配合sort一起使用。

    下面举个例子,test.txt 的具体内容如下:


qitai@127:~/tmp$ cat test.txt
aa
bb
aa
cc
bb





排重可以通过命令:

qitai@127:~/tmp$ cat test.txt  | sort | uniq
aa
bb
cc




如果需要获取每条重复记录的出现的次数,可以使用-c选项:

qitai@127:~/tmp$ cat test.txt  | sort | uniq -c
       2 aa
       2 bb
       1 cc




     gawk排重:

    使用gawk排重的话,原理是用一个数组的索引来存储每行记录,数组的值可以存放出现次数。

qitai@127:~/tmp$ cat test.txt  | gawk '{a[$1]++}; END {for (b in a) print a, b}'
2 bb
1 cc
2 aa




{a[$1]++}; 这一行的作用是使用一个a数组,他的索引是记录的第一列,就是这里的aa 或 bb那些。“{}”号前面没有作用域,对每条记录都生效。

END {for (b in a) print a, b} 这一行是在遍历后记录后,遍历数组a,打印结果。




     uniq跟gawk都能用来进行排重处理,uniq使用起来应该比较方便,记住uniq跟sort命令就行。但是就效率来说uniq的效率比gawk差多了,因为使用uniq之前要进行排序,最好的情况是n*log(n)复杂度,而使gawk只需要遍历一遍,也就是n的复杂度。所以这里跟大家建议,对于小文件,可以使用sort + uniq进行排重处理,但是对于大文件,使用gawk会给你节省不少时间。

论坛徽章:
0
2 [报告]
发表于 2012-02-19 19:13 |只看该作者
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP