之所以要把这个方法公布出来,因为我在这个问题上纠结了很长时间不能解决,搞的一天一夜没睡。希望大家不要走俺的老路。
废话少说,快吧命令说出来。
方法一
先排序
:sort
然后删除的重复项的后面一项
:g/\%(^\1$\n\)\@<=\(.*\)$/d
或者
先排序
:sort
然后删除重复项的前面一项
:g/^\(.*\)$\n\1$/d
原作者地址:http://vim.wikia.com/wiki/Uniq_-_Removing_duplicate_lines
作者介绍的很详细,其他的方法他也给出了,不过就是个老外。
方法二
也是先排序(为什么总是排序,后面会告诉你)
:sort
然后不要同时排序
:sor ur /^/
第二种方法为依云提供http://lilydjwg.is-programmer.com/
方法三
先排序
:sort
然后用替换的方法
:%s/^\(.*\)\(\n\1\)\+$/\1/
其他方法为什么不行,这个不行也是相对的,如果你只是处理10多条数据,基本上每种方法都可以。如果你处理上千条就会各种bug,为什么呢,各种数据形式考虑不全面。让我们看个案例:
案例
1、先说google搜索viw去重复行第二名
http://hi.baidu.com/asnahu/blog/item/2272ecb435417e788bd4b2a4.html
为这个问题发愁的,很多人都看了他的bolg吧。首先看作者自己的方法
:%s/\(.*\)\n\1/\1\r/g
:g/^$/d
我们来直接看下效果,我截取了 478行数据做个测试。
运行命令前
我们预备要删除的数据是黄色标识,
现在大家看到排序的好处了吧,命令对不对,肉眼都能看出来(有的数据默认排好序的不再我说范围之类),这只是好处之一,听我后面细细道来。
运行命令
:%s/\(.*\)\n\1/\1\r/g
:g/^$/d
我们看图
对重复两项以上的数据不能正常处理,并且这一行包含有上一行全部数据的话,被包含的要被删除。作者很明显的没用行开头标志^做为搜索条件
2.然后在看博主提供的命令加强版
其实就是我们的方法一的删除部分命令
:g/^\(.*\)$\n\1$/d
:g/\%(^\1$\n\)\@<=\(.*\)$/d
两者都是前面的命令和我的相似,它删除的是重复项的前面一项;后面的命令删除的重复项的后面的内容。注意两个命令独立的,可以分别使用。对于g命令不是很熟悉,它是一个全局命令,以后会有全面介绍。
博主说的很清楚了两个命令是独立的,每个都能完成我们想要的工作。我们还等什么直接测试,
在没排序的情况下,上图
运行命令
:g/^\(.*\)$\n\1$/d
然后我们排好序列,然后直观的看效果,上图
一条没删除,说明在乱排序的情况下没有重复的两项挨着。
我们先排序
:sort
排好序列然后运行
:g/^\(.*\)$\n\1$/d
上图
博主的另一个加强版命令同理。
看到这里大家都明白了吧。
必须先排序,然后运行正确的删除命令。
反面教材一、
http://kangzye.blog.163.com/blog/static/36819223201061705729933/
删除重复行(先排一下序):
:sort
:g/^\(.\+\)$\n\1/d
反面教材二、
http://hi.baidu.com/ares_esheng/blog/item/b921d35462722958d109065b.html
:%s/^\(.*\)\n\1/\1$/ : 删除重复行 # 非贪婪匹配,\{-}
复制或者翻译的文章,原作者是对的,他一复制竟然错了
真实作者地址
http://www.rayninfo.co.uk/vimtips.html
:%s/^\(.*\)\(\n\1\)\+$/\1/ : delete multiple duplicate lines [N]
我里个擦,外面天都亮了