在 Linux 中删除非重复的行

在 Linux 中删除非重复的行

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

例子:

abc
bbc
abc
bbc
ccc
bbc

结果:

abc
bbc
abc
bbc
bbc

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

是否还可以删除不重复的行且只有 2 个重复的行,并保留有 2 个以上重复行的行?

答案1

其他人发布的解决方案不适用于我的 Debian Jessie:他们保留了一个单身的复制任何重复的行,而根据我对 OP 的理解全部重复行的副本应保留。如果我理解正确的话,那么...

  1. 以下命令

    awk '!seen[$0]++' file
    

    删除所有重复的行。

  2. 以下命令

    awk 'seen[$0]++' file 
    

    输出所有重复项,但不输出原始副本:IE,如果出现一条线n次,它输出行n-1次。

  3. 然后命令

    awk 'seen[$0]++' file > temp && awk '!seen[$0]++' file >> temp
    

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

  4. 如果您想要有两个或更多重复项的行,您现在可以迭代上述操作:

    awk 'seen[$0]++' file | awk 'seen[$0]++' > temp
    

    保持n-2复制了n>1重复。现在

    awk '!seen[$0]++' temp > temp1 
    

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

    cat temp1 >> temp; cat temp1 >> temp
    
  5. 如果需要对出现的行执行此操作或更多次,以下命令

      awk 'seen[$0]++ && seen[$0] > N' file 
    

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

答案2

您可以使用sort&uniq命令来实现这一点。

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

cat abc.txt |sort|uniq -d

输出将是;

abc 
bbc

答案3

@UUU 的答案没有保持排序顺序。要保持排序顺序,请改用以下内容:

 printf '%s\n' abc bbc abc bbc ccc bbc | \
     nl -nrz     | \
     sort -k2    | \
     uniq -f1 -D | \
     sort        | \
     cut -f2
  1. printf命令只是重现输入。
  2. nl命令会在行号后附加前导零,以允许sort不使用-V标志。
  3. sort命令按第二个字段排序。默认情况下,字段以空格分隔。
  4. uniq命令识别唯一的相邻行(这就是为什么您必须先排序)并-f1跳过第一个字段,即行号。
  5. sort再次恢复原始顺序。
  6. cut删除前导行号。

相关内容