【问题标题】:how to delete closely duplicate lines in vim如何在vim中删除重复的行
【发布时间】:2013-11-12 21:30:53
【问题描述】:

我有以下几行:

123 abcd 456 xyz
123 abcd 678 xyz
234 egfs 434 ert
345 fggfgf 456 455 rty
234 egfs 422 ert 33

所以在这里,如果多行的第一个字段相同,则它们被认为是重复的。因此,在上面的示例中,123 在 2 行中是相同的,它们被认为是重复的(尽管它们在中间的一个字段中有所不同)。同样,带有 234 的行是重复的。 我需要删除这些重复的行。

由于它们不是 100% 重复的,sort u 不起作用。有谁知道我如何删除这些重复的行?

【问题讨论】:

  • 我的建议是编写一个“过滤器”程序来执行您想要的过滤,并在 vim 内部使用它。不过,您也许可以在 vim 中使用脚本语言在 vim 中完成所有工作。

标签: unix vim duplicate-removal cut


【解决方案1】:

这对 awk 来说是一项非常容易的任务,我会用 awk 来完成。在 vim 中,你可以这样做:

% !awk '\!a[$1]++'

那么你得到了:

123 abcd 456 xyz
234 egfs 434 ert
345 fggfgf 456 455 rty

如果您在 shell 中执行此操作,则不必转义 !:

awk '!a[$1]++' file

【讨论】:

  • 您好,肯特,感谢您的回复。但是,当我尝试运行上述命令时,它会说 a[: Event not found 失败。有什么解决办法吗?
  • 您确实安装了 awk,不是吗?该行应该可以工作,不要忘记(单)引号awk '...' file 复制我的 cmd 行,然后尝试。 @user2985124
  • +1 这很棒。你介意多解释一下这个命令在做什么吗?
  • @MattParker 你可以在这里找到解释:stackoverflow.com/questions/15797442/… in this answer OP希望第一个字段($1)作为键,所以使用$1而不是$0。跨度>
【解决方案2】:
g/\%(^\1\>.*$\n\)\@<=\(\k\+\).*$/d

【讨论】:

  • 我在哪里运行这个命令?当我使用 :g/\%(^\1>.$\n)\@
  • 这不是很有帮助(尤其是当它运行不正确时)。请在您的答案中至少包含一个概述。这是更多的工作,但也会让你投票和接受。
【解决方案3】:

使用我的PatternsOnText plugin 很容易。它允许指定重复检查忽略的模式;在您的情况下,这将是第一个(空格分隔)字段之后的所有内容:

%DeleteDuplicateLinesIgnoring / .*/

【讨论】:

    猜你喜欢
    • 2012-04-17
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 2016-03-15
    • 2021-05-22
    • 1970-01-01
    相关资源
    最近更新 更多