Chinaunix首页 | 论坛 | 博客
  • 博客访问: 215454
  • 博文数量: 87
  • 博客积分: 192
  • 博客等级: 入伍新兵
  • 技术积分: 455
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-14 07:44
文章分类

全部博文(87)

文章存档

2013年(1)

2012年(86)

分类:

2012-04-14 15:37:36

原文地址:sed之仅打印相邻重复的行 作者:zooyo

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 就可以省略匹配的内容。
阅读(751) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~