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

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

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2011-12-05 15:38:59

cat file 
aaa
bbb
bbb
ccc
ddd
eee
eee
fff

只显示重复的行:
bbb
bbb
eee
eee



  1. sed -n ':a;N;/\(.\+\)\n\1/!D;p' file
[解析]
读取下一行,如果两行内容一样的打印,然后跳转命令行尾,不执行 D ,如果没匹配到就 D 删除第一行,跳转去命令行首继续执行。



  1. awk 'i{if($0==x){print x"\n"x;i=0}}{x=$0;i=1}' file <(echo)



以上的例子仅局限在两行重复的情况,那么有多行重复的情况呢?比如:
cat file
aaa
bbb
bbb
bbb
ddd
eee
eee

要得到:
bbb
bbb
bbb
eee
eee



  1. sed -n '$!N;/\(.*\)\n\1$/{P;ba};x;/\(.*\)\n\1$/P;x;:a;h;D' file
[解析]
这是Tim大师的代码,整体的思路是判断如果是相邻两行重复的话,就 P 打印第一行,然后把当前的 pattern space 中,当相邻行不匹配重复时,x 交换两个空间的内容,把 hold space 里的内容(就是上一行的 pattern space里的内容后拷贝到的 hold space),再匹配看是否两行重复,如果重复的话就打印。这样就把连续的相邻的行打印出来,避免了因为前两行相同,而第三行和第四行不匹配的话,就无法打印第三行的内容了。这个思路很值得借鉴。另外该代码可以优化为
  1. sed -n '$!N;/\(.*\)\n\1$/{P;ba};x;//P;x;:a;h;D' file
//P 就可以省略匹配的内容。
阅读(3568) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

狼眼不发光2016-02-15 10:56:32

sed \':a;$!N;s/\\(.\\+\\)\\n\\1$/\\1@\\1/;ta;h;s/\\(.\\+\\)\\n.*/\\1/;s/@/\\n/gp;g;D\' file
献丑了~