题
我有一个文本文件,其中包含一长串条目(每行一个)。其中一些是重复的,我想知道是否可以(如果可以,如何)删除任何重复项。如果可能的话,我有兴趣在 vi/vim 中执行此操作。
解决方案
如果你与你的排序文件就OK,你可以使用:
:sort u
其他提示
尝试这种情况:
:%s/^\(.*\)\(\n\1\)\+$/\1/
它搜索紧接着的自身一个或多个拷贝的任何线路,和具有单拷贝替换它。
请您的文件,虽然你试试吧前一个副本。它是未经测试。
从命令行只是做:
sort file | uniq > file.new
如果要保留的顺序awk '!x[$0]++' yourfile.txt
(即,分选是不可接受的)。为了从VIM调用它,可以使用:!
。
g/^\(.*\)$\n\1/d
为我工作在Windows上。线必须虽然排序第一
我将合并两个问题的答案以上:
go to head of file
sort the whole file
remove duplicate entries with uniq
1G
!Gsort
1G
!Guniq
如果您有兴趣看到许多重复的行是如何去除,使用控制-G之前和之后,检查存在于你的缓冲区的行数。
选择在视觉行模式中线(移 + v ),然后:!uniq
。这将只赶上其接踵而来重复。
关于如何在 VimL 中实现 Uniq,请在 我正在维护的插件. 。您将看到 Vim 邮件列表中给出的各种实现方法。
否则, :sort u
确实是要走的路。
:%s/^\(.*\)\(\n\1\)\+$/\1/gec
或
:%s/^\(.*\)\(\n\1\)\+$/\1/ge
这是我对你的回答,它可以删除多个重复的线条和 只留一个无法删除!
我会用!}uniq
,但是,只有当没有空行工作。
有关在一个文件中使用的每一行:。:1,$!uniq
此版本只删除重复线是contigous。我的意思是,只删除连续重复行。使用给定的映射函数可以做笔记乱用空行。但是,如果改变正则表达式匹配线的开始^
它也将删除重复的空行。
" 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命令行使用sort和uniq:
sort {file-name} | uniq -u
这为我工作都.csv
和.txt
awk '!seen[$0]++' <filename> > <newFileName>
<强>说明:强> 该命令打印唯一的行的第一部分和第二部分,即中间箭头之后是保存的第一部分的输出。
awk '!seen[$0]++' <filename>
>
<newFileName>