我有一个文本文件,其中包含一长串条目(每行一个)。其中一些是重复项,我想知道是否有可能(如果可以,如何)删除任何重复项。如果可能的话,我有兴趣在vi / vim中进行此操作。
我有一个文本文件,其中包含一长串条目(每行一个)。其中一些是重复项,我想知道是否有可能(如果可以,如何)删除任何重复项。如果可能的话,我有兴趣在vi / vim中进行此操作。
Answers:
如果可以对文件进行排序,则可以使用:
:sort u
:%!uniq
来简单地删除重复的条目而不对文件进行排序。
u
试试这个:
:%s/^\(.*\)\(\n\1\)\+$/\1/
它会搜索紧随其后的一个或多个副本的任何行,并将其替换为一个副本。
在尝试之前,请先复制文件。未经测试。
从命令行执行:
sort file | uniq > file.new
:sort u
我的大文件一样,无法获得公认的工作答案。这项工作非常迅速且完美。谢谢!
'uniq' is not recognized as an internal or external command, operable program or batch file.
g/^\(.*\)$\n\1/d
在Windows上对我有效。但是,必须首先对行进行排序。
aaaa
其后aaaabb
将aaaa
错误地删除。
我将结合以上两个答案:
go to head of file
sort the whole file
remove duplicate entries with uniq
1G
!Gsort
1G
!Guniq
如果您想查看删除了多少重复的行,请在前后使用control-G检查缓冲区中存在的行数。
'uniq' is not recognized as an internal or external command, operable program or batch file.
在可视线模式(Shift+ v)中选择线,然后选择:!uniq
。那只会捕获重复出现的重复项。
此版本仅删除连续的重复行。我的意思是,仅删除连续的重复行。使用给定的地图,该功能确实会引起空白行的混乱。但是,如果更改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>