使用 vim 删除 unix 中的重复字段

remove duplicate fields in unix with vim

如果我在 vi 中有以下格式,但对于数百个类别和数千个项目:

    Category1
    item
    Category1
    item
    Category1
    item
    Category2
    item
    Category2
    item
    Category2
    item

vi 中有没有办法像这样结束:

    Category1
    item
    item
    item
    Category2
    item
    item
    item

我需要删除除第一个类别之外的所有类别实例。我需要保留所有物品。 我尝试过补充和全局更改,但没有任何运气。帮助将不胜感激,干杯。

假设 = 位于类别行的末尾....

将文件保存到(例如)foo.txt在 Solaris 上使用 nawk,而不是 awk。

awk '/=$/ && !arr[[=10=]]++ {print; next}  {print [=10=]} ' foo.txt > newfile.txt

对不起。我不清楚如何在 vi/vim 中执行此操作而无需大量输入工作或使用复杂的 ed 文件。其他人可能有想法。如果你完全卡住了,试试上面的方法。

我的 PatternsOnText plugin 有(除其他外)一个 :DeleteDuplicateLinesOf 命令。假设可以通过尾随 = 检测到类别(正如您在评论中指出的那样),此命令将执行:

:DeleteDuplicateLinesOf /=$/

就像@jimmcnamara 的awk 解决方案一样,这仍然假设相同的类别都按顺序出现在文件中;即它不会围绕项目移动,只是删除了重复的类别行。