我有一个文本文件,其中包含一长串条目(每行一个)。其中一些是重复的,我想知道是否有可能(如果是这样,如何)删除任何重复。如果可能的话,我有兴趣在vi / vim中这样做。
答案 0 :(得分:228)
如果您对文件进行排序没问题,可以使用:
:sort u
答案 1 :(得分:25)
试试这个:
:%s/^\(.*\)\(\n\1\)\+$/\1/
它会搜索紧跟一个或多个自身副本的任何行,并用一个副本替换它。
在尝试之前复制文件。这是未经测试的。
答案 2 :(得分:20)
从命令行执行:
sort file | uniq > file.new
答案 3 :(得分:7)
awk '!x[$0]++' yourfile.txt
如果您想保留订单(即不接受排序)。为了从vim调用它,可以使用:!
。
答案 4 :(得分:6)
g/^\(.*\)$\n\1/d
在Windows上为我工作。必须首先对行进行排序。
答案 5 :(得分:5)
我会结合上面的两个答案:
go to head of file
sort the whole file
remove duplicate entries with uniq
1G
!Gsort
1G
!Guniq
如果您有兴趣查看删除了多少重复行,请使用control-G之前和之后检查缓冲区中存在的行数。
答案 6 :(得分:3)
以可视线模式选择线条( Shift + v ),然后选择:!uniq
。那只会抓住一个接一个的重复。
答案 7 :(得分:0)
我会使用!}uniq
,但只有在没有空行时才有效。
对于文件中的每一行,使用::1,$!uniq
。
答案 8 :(得分:0)
关于如何在VimL中实施Uniq,请在plugin I'm maintaining中搜索Uniq。您将看到在Vim邮件列表中给出的各种实现方法。
否则,:sort u
确实是可行的方法。
答案 9 :(得分:0)
:%s/^\(.*\)\(\n\1\)\+$/\1/gec
或
:%s/^\(.*\)\(\n\1\)\+$/\1/ge
这是我的答案,它可以删除多个重复的行和 只保留一个不删除!
答案 10 :(得分:0)
此版本仅删除重复的重复行。我的意思是,只删除连续的重复行。使用给定的地图,该功能确实注意到空白行。但是如果更改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>
答案 11 :(得分:0)
不使用vi / vim(用于非常大的文件)的另一种方法是从Linux命令行使用sort和uniq:
sort {file-name} | uniq -u
答案 12 :(得分:0)
这对.csv
和.txt
都有效
awk '!seen[$0]++' <filename> > <newFileName>
说明: 该命令的第一部分将打印唯一的行,第二部分即在中间箭头之后将保存第一部分的输出。
awk '!seen[$0]++' <filename>
>
<newFileName>
答案 13 :(得分:0)
如果您不想对整个文件进行排序/uniq,您可以在可视模式下选择要进行 uniq 的行,然后简单地::sort u
。