vim删除重复行 (走过弯路的人血泪总结)

本文详细介绍了如何使用Vim编辑器通过排序和特定命令高效地去除文本文件中的重复行,包括多种方法的对比和分析。重点强调了排序步骤的重要性,以及不同命令的应用场景和局限性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   之所以要把这个方法公布出来,因为我在这个问题上纠结了很长时间不能解决,搞的一天一夜没睡。希望大家不要走俺的老路。

  废话少说,快吧命令说出来。


方法一

先排序
: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/

作者地址http://www.vimer.cn/2009/11/vimgvim%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%9F%A5%E6%89%BE%E6%9B%BF%E6%8D%A25-%E5%8E%8B%E7%BC%A9%EF%BC%88%E5%88%A0%E9%99%A4%EF%BC%89%E9%87%8D%E5%A4%8D%E8%A1%8C.html


其他方法为什么不行,这个不行也是相对的,如果你只是处理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]

我里个擦,外面天都亮了

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值