删除vi中的重复行?

时间:2008-12-08 22:24:20

标签: vim duplicates

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

14 个答案:

答案 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