不排序删除重复的线[复制](Remove duplicate lines without sorti

2019-06-17 11:14发布

这个问题已经在这里有一个答案:

  • 如何删除重复的线路中的Unix文件? 8个回答

我有一个Python脚本工具:

#!/usr/bin/env python
import sys
unique_lines = []
duplicate_lines = []
for line in sys.stdin:
  if line in unique_lines:
    duplicate_lines.append(line)
  else:
    unique_lines.append(line)
    sys.stdout.write(line)
# optionally do something with duplicate_lines

这个简单的功能(uniq的,而不需要先进行排序,排序稳定)必须作为一个简单的Unix工具,绝不能呢? 也许过滤器管道中的组合?

原因问:需要上,我无法从任何地方执行Python的系统上这个功能

Answer 1:

在UNIX猛砸脚本博客建议 :

awk '!x[$0]++'

此命令告诉awk的线条打印的。 变量$0保持线的全部内容和方括号是数组访问。 因此,对于文件的每一行,该阵列的节点x被增量,(行打印如果该节点的含量不! )预先设定。



Answer 2:

逾期答案 - 我只是碰到了这样一个重复的 - 但也许值得加入...

@后面1_CR的回答可以更简明地写,使用原则cat -n而不是awk添加行号:

cat -n file_name | sort -uk2 | sort -nk1 | cut -f2-
  • cat -n前面加上行号
  • 使用sort -u删除重复数据
  • 使用sort -n以数字预谋排序
  • 使用cut去除行号


Answer 3:

上述迈克尔·霍夫曼的解决方案是简短而亲切。 对于大文件,使用Schwartzian变换方法包括添加用awk随后多轮sort和uniq的索引字段中涉及较少的内存开销。 下面的代码片段工作在bash

awk '{print(NR"\t"$0)}' file_name | sort -t$'\t' -k2,2 | uniq --skip-fields 1 | sort -k1,1 -t$'\t' | cut -f2 -d$'\t'


Answer 4:

从2个文件删除重复的:

awk '!a[$0]++' file1.csv file2.csv


Answer 5:

谢谢1_CR! 我需要一个“uniq的-u”(删除重复全部),而不是uniq的(重复的留复印件1份)。 该AWK和Perl解决方案不能真正被修改做到这一点,你的就可以! 我可能还需要较低的内存使用,因为我会像uniq'ing线条亿8)。 万一别人需要它,我只是把在命令uniq的部分“-u”:

awk '{print(NR"\t"$0)}' file_name | sort -t$'\t' -k2,2 | uniq -u --skip-fields 1 | sort -k1,1 -t$'\t' | cut -f2 -d$'\t'


Answer 6:

我只是想取消对以下各行的所有副本,不是到处在文件中。 所以我用:

awk '{
  if ($0 != PREVLINE) print $0;
  PREVLINE=$0;
}'


Answer 7:

uniq在alias命令作品甚至http://man7.org/linux/man-pages/man1/uniq.1.html



Answer 8:

现在,你可以检查出是写在小锈工具: UQ 。

它执行的唯一性的滤波,而无需先排序的输入,因此可应用在连续流。



文章来源: Remove duplicate lines without sorting [duplicate]