我有一个文本文件,其中包含一长串条目(每行一个)。其中一些是重复的,我想知道是否可以(如果可以,如何)删除任何重复项。如果可能的话,我有兴趣在 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>

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top