Chinaunix首页 | 论坛 | 博客
  • 博客访问: 78714
  • 博文数量: 30
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 165
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-05 17:14
文章分类
文章存档

2012年(15)

2011年(15)

分类:

2012-02-01 17:27:06

原文地址:sed之找出重复的行 作者:zooyo

首先保证重复行必须是相邻的,否则先排序。
cat file
a
b
b
c
d
d
d
e

找出重复的行:
b
d




  1. sed -rn 'N;/(.*)\n\1$/{P;:a;s/\n.*//;N;/(.*)\n\1$/ba};D' file
[解析]
匹配到重复的行,就打印,然后把重复的内容替换成一行,再读取下一行,如果还是重复就再替换成一行,直到和下一行不重复,然后 D 删除不重复的内容。这样就保证第一次读取到重复的行,被打印出来。



  1. sed '$!N;/\(.*\)\n\1$/!{x;//P;x};h;D' file
[解析]
这才是文本的精华。首先读取下一行的内容到 pattern space 里,如果匹配到两行是一样的内容,那么就把该内容拷贝到 hold space 里,然后删除第一行,又继续读取下一行,这样反复操作,就把重复的行处理成最后两个重复的,都放到 holde space 里保存,直到读去下一行内容不一样时,就交换出 hold space 里的内容,再检测一次是否两行是一样,然后打印出第一行,再次交换,然后拷贝到 hold space 里。这里并没有利用到替换,而是用 h 拷贝覆盖 hold space 里的内容来达到去处多余的重复的行。sed的上乘佳作啊,感谢Tim大师的指点。



  1. awk 'a[$1]++==1' file
  2. awk '++a[$1]==2' file
[解析]
这是最简单的,用数组计数统计。
阅读(896) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~