删除 vi 中的重复行?

我有一个文本文件,其中包含一个长长的条目列表(每行一个)。其中一些是重复的,我想知道是否有可能(如果有,如何)删除任何重复。如果可能的话,我有兴趣在 vi/vim 中完成这项工作。

93443 次浏览

试试这个:

:%s/^\(.*\)\(\n\1\)\+$/\1/

它搜索紧随其后的任何一行,并使用一个或多个副本替换它。

在你试用之前先复制一份你的文件,它还没有经过测试。

如果你可以对你的文件进行排序,你可以使用:

:sort u

选择视线模式下的线条(Shift + v) ,然后选择 :!uniq。这样只会捕捉到一个接一个的重复。

我会使用 !}uniq,但这只有在没有空行的情况下才有效。

对于文件中的每一行使用: :1,$!uniq

我将综合以上两个答案:

go to head of file
sort the whole file
remove duplicate entries with uniq


1G
!Gsort
1G
!Guniq

如果您想知道删除了多少重复的行,那么在查看缓冲区中存在的行数之前和之后使用 control-G。

关于如何在 VimL 中实现 Uniq,在 我正在维护的插件中搜索 Uniq。您将看到在 Vim 邮件列表中提供的各种实现它的方法。

否则,:sort u确实是一条出路。

g/^\(.*\)$\n\1/d

对我来说在 Windows 上是可行的。不过行必须先排序。

只需在命令行中执行:

sort file | uniq > file.new
:%s/^\(.*\)\(\n\1\)\+$/\1/gec

或者

:%s/^\(.*\)\(\n\1\)\+$/\1/ge

这是我给你的答案,它可以删除多个重复行和 只保留一个,不要移除!

如果希望保留订单,则为 awk '!x[$0]++' yourfile.txt(即,排序是不可接受的)。为了从 vim 调用它,可以使用 :!

此版本仅删除重复的相邻行。我的意思是,只删除连续的重复行。使用给定的映射,该函数确实注意到与空白行混乱。但是,如果更改 REGEX 以匹配行 ^的开始,它也将删除重复的空行。

" function to delete duplicate lines
function! DelDuplicatedLines()
while getline(".") == getline(line(".") - 1)
exec 'norm! ddk'
endwhile
while getline(".") == getline(line(".") + 1)
exec 'norm! dd'
endwhile
endfunction
nnoremap <Leader>d :g/./call DelDuplicatedLines()<CR>

另一种不使用 vi/vim (对于非常大的文件)的方法是来自 Linux 命令行 use sort and uniq:

sort {file-name} | uniq -u

这对 .csv.txt都适用

awk '!seen[$0]++' <filename> > <newFileName>

说明: 命令的第一部分打印唯一的行,第二部分(即中箭头之后)保存第一部分的输出。

awk '!seen[$0]++' <filename>

>

<newFileName>

如果不想对整个文件进行排序/uniq,可以选择要在可视化模式下创建 uniq 的行,然后简单地选择: :sort u