首先保证重复行必须是相邻的,否则先排序。cat file
a
b
b
c
d
d
d
e
找出重复的行:
b
d
- sed -rn 'N;/(.*)\n\1$/{P;:a;s/\n.*//;N;/(.*)\n\1$/ba};D' file
[解析]
匹配到重复的行,就打印,然后把重复的内容替换成一行,再读取下一行,如果还是重复就再替换成一行,直到和下一行不重复,然后 D 删除不重复的内容。这样就保证第一次读取到重复的行,被打印出来。
- 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大师的指点。
- awk 'a[$1]++==1' file
-
awk '++a[$1]==2' file
[解析]
这是最简单的,用数组计数统计。
阅读(6339) | 评论(4) | 转发(2) |