代码之家  ›  专栏  ›  技术社区  ›  Sydius

移除vi中的重复行?

  •  103
  • Sydius  · 技术社区  · 16 年前

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

    13 回复  |  直到 16 年前
        1
  •  309
  •   Brian Carper    16 年前

    如果您同意对文件进行排序,可以使用:

    :sort u
    
        2
  •  29
  •   Brad Koch Daniel Wright    5 年前

    :%s/^\(.*\)\(\n\1\)\+$/\1/
    

    它搜索紧跟着一个或多个自身副本的任何行,并将其替换为单个副本。

    但在尝试之前,请先复制一份文件。这是未经测试的。

        3
  •  25
  •   kenorb    9 年前

    sort file | uniq > file.new
    
        4
  •  11
  •   Rovin Bhandari    8 年前

    awk '!x[$0]++' yourfile.txt 如果要保留订单(即,不接受排序)。为了从vim调用它, :! 可以使用。

        5
  •  6
  •   Bridgey    15 年前
    g/^\(.*\)$\n\1/d
    

        6
  •  5
  •   Jon DellOro    16 年前

    我将结合以上两个答案:

    go to head of file
    sort the whole file
    remove duplicate entries with uniq
    
    1G
    !Gsort
    1G
    !Guniq
    

    如果您有兴趣查看删除了多少重复行,请在前后使用control-G检查缓冲区中存在的行数。

        7
  •  3
  •   kenorb    9 年前

    在视觉线条模式下选择线条( 转移 :!uniq . 那只会捕捉到一个接一个的重复。

        8
  •  1
  •   Luc Hermitte    16 年前

    关于如何在VimL中实现Uniq,请在 plugin I'm maintaining

    否则 :sort u 这确实是一条路要走。

        9
  •  0
  •   cn8341    10 年前
    :%s/^\(.*\)\(\n\1\)\+$/\1/gec
    

    :%s/^\(.*\)\(\n\1\)\+$/\1/ge
    

    这是我给你的答案,它可以删除多个重复行和

        10
  •  0
  •   kenorb    9 年前

    我会用 !}uniq ,但这仅在没有空行的情况下有效。

    对于文件中的每一行,请使用: :1,$!uniq .

        11
  •  0
  •   SergioAraujo    6 年前

    此版本仅删除连续的重复行。我的意思是,只删除连续重复的行。使用给定的映射,函数不会将空白行弄乱。但如果更改正则表达式以匹配行的开头 ^ 它还将删除重复的空行。

    " 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>
    
        12
  •  0
  •   william-1066    6 年前

    另一种不使用vi/vim(对于非常大的文件)的方法是从Linux命令行使用sort和uniq:

    sort {file-name} | uniq -u
    
        13
  •  0
  •   paul    6 年前

    .csv .txt

    awk '!seen[$0]++' <filename> > <newFileName>

    说明: 命令的第一部分打印唯一的行,第二部分(即中间箭头之后)保存第一部分的输出。

    awk '!seen[$0]++' <filename>

    >

    <newFileName>

        14
  •  0
  •   John Poulis    4 年前

    :sort u .