Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3025001
  • 博文数量: 272
  • 博客积分: 5544
  • 博客等级: 大校
  • 技术积分: 5496
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 00:48
个人简介

  每个人都要有一个骨灰级的爱好,不为金钱,而纯粹是为了在这个领域享受追寻真理的快乐。

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2012-01-11 23:33:53

首先保证重复行必须是相邻的,否则先排序。
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
[解析]
这是最简单的,用数组计数统计。
阅读(6345) | 评论(4) | 转发(2) |
0

上一篇:awk之对段落的处理

下一篇:Linux 定时器

给主人留下些什么吧!~~

yestreenstars2012-12-19 17:36:44

zooyo: # cat file
a
b
b
c
d
d
d
d
e
# sed -n 'N;s/\(.\+\)\n\1/\1/p;D' file                    
b
d
d
# sed '$!N;/\(.*\)\n\1$/!{x;//P;x};h;D' file
b
d.....
汗颜~多谢版主提醒~

zooyo2012-12-18 10:52:47

yestreenstars: 既然前提是“首先保证重复行必须是相邻的,否则先排序。”,那就好办多了,版主看一下我这个够简洁不~
sed -nr 'N;s/(.+)\n\1/\1/p;D'.....
# cat file
a
b
b
c
d
d
d
d
e
# sed -n 'N;s/\(.\+\)\n\1/\1/p;D' file                    
b
d
d
# sed '$!N;/\(.*\)\n\1$/!{x;//P;x};h;D' file
b
d

yestreenstars2012-12-17 17:21:16

既然前提是“首先保证重复行必须是相邻的,否则先排序。”,那就好办多了,版主看一下我这个够简洁不~
sed -nr 'N;s/(.+)\n\1/\1/p;D'

伤不起2012-07-03 17:36:30

能具体讲一下{x;//P;x}这段,吗?斑竹,Thanks