删除 Linux 中的非重复行

qlw*_*wik 4 linux awk text-manipulation uniq

如何使用任何 linux 程序链接 sed、awk 或任何其他程序从文本文件中删除非重复行?

例子:

abc
bbc
abc
bbc
ccc
bbc
Run Code Online (Sandbox Code Playgroud)

结果:

abc
bbc
abc
bbc
bbc
Run Code Online (Sandbox Code Playgroud)

第二个列表已删除 ccc,因为它没有重复的行。

是否也可以删除只有 2 个重复行的非重复 AND 行,并留下那些有超过 2 个重复行的行?

Mar*_*iae 10

其他人发布的解决方案在我的 Debian Jessie 上不起作用:他们保留任何重复行的单个副本,而我对 OP 的理解是保留重复行的所有副本。如果我已经正确理解了 OP,那么...

  1. 以下命令

    awk '!seen[$0]++' file
    
    Run Code Online (Sandbox Code Playgroud)

    删除所有重复的行。

  2. 以下命令

    awk 'seen[$0]++' file 
    
    Run Code Online (Sandbox Code Playgroud)

    输出所有副本,但不输出原始副本:,如果一行出现n次,则输出该行n-1次。

  3. 然后命令

    awk 'seen[$0]++' file > temp && awk '!seen[$0]++' file >> temp
    
    Run Code Online (Sandbox Code Playgroud)

    解决你的问题。这些行不是按原始顺序排列的。

  4. 如果你想要有两个或更多重复的行,你现在可以迭代上面的:

    awk 'seen[$0]++' file | awk 'seen[$0]++' > temp
    
    Run Code Online (Sandbox Code Playgroud)

    保留n >1 个重复行的n-2 个副本。现在

    awk '!seen[$0]++' temp > temp1 
    
    Run Code Online (Sandbox Code Playgroud)

    从临时文件中删除所有重复的行,您现在可以获得您想要的内容(只有n>1重复的行)如下:

    cat temp1 >> temp; cat temp1 >> temp
    
    Run Code Online (Sandbox Code Playgroud)
  5. 如果您需要对出现N次或更多次的行执行此操作,请执行以下命令

      awk 'seen[$0]++ && seen[$0] > N' file 
    
    Run Code Online (Sandbox Code Playgroud)

    比将命令链接N次更简单awk 'seen[$0]++' file


小智 7

您可以为此使用sort&命令。uniq

如果你的数据在 abc.txt 文件中,那么;

cat abc.txt |sort|uniq -d
Run Code Online (Sandbox Code Playgroud)

输出将是;

abc 
bbc
Run Code Online (Sandbox Code Playgroud)