sed找到重复的行

sed之仅打印相邻重复的行

cat file 
aaa
bbb
bbb
ccc
ddd
eee
eee
fff
 
只显示重复的行:
bbb
bbb
eee
eee
 
sed -n ':a;N;/\(.\+\)\n\1/!D;p' file
[解析]
读取下一行,如果两行内容一样的打印,然后跳转命令行尾,不执行 D ,如果没匹配到就 D 删除第一行,跳转去命令行首继续执行。
 
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
 
sed -n '$!N;/\(.*\)\n\1$/{P;ba};x;/\(.*\)\n\1$/P;x;:a;h;D'   file
 
[解析]
整体的思路是判断如果是相邻两行重复的话,就 P 打印第一行,然后把当前的 pattern space 中,当相邻行不匹配重复时,x 交换两个空间的内容,把 hold space 里的内容(就是上一行的 pattern space里的内容后拷贝到的 hold space),再匹配看是否两行重复,如果重复的话就打印。这样就把连续的相邻的行打印出来,避免了因为前两行相同,而第三行和第四行不匹配的话,就无法 打印第三行的内容了。这个思路很值得借鉴。另外该代码可以优化为
sed -n '$!N;/\(.*\)\n\1$/{P;ba};x;//P;x;:a;h;D'  file
//P 就可以省略匹配的内容。
 
REF:
http://blog.chinaunix.net/uid-10540984-id-3034540.html
 
posted @ 2013-09-26 19:07  emanlee  阅读(2717)  评论(0编辑  收藏  举报