cat file
aaa
bbb
bbb
ccc
ddd
eee
eee
fff
只显示重复的行:
- 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
要得到:
- 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),再匹配看是否两行重复,如果重复的话就打印。这样就把连续的相邻的行打印出来,避免了因为前两行相同,而第三行和第四行不匹配的话,就无法打印第三行的内容了。这个思路很值得借鉴。另外该代码可以优化为
- sed -n '$!N;/\(.*\)\n\1$/{P;ba};x;//P;x;:a;h;D' file
//P 就可以省略匹配的内容。
阅读(3564) | 评论(1) | 转发(1) |