Unix:删除重复的行而不进行sorting

我在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 

这个简单的function(uniq,无需sorting第一,稳定的顺序)必须作为一个简单的UNIX实用程序可用,不是吗? 也许在pipe道中的filter的组合?

提问的理由:在我无法从任何地方执行python的系统上需要此function

UNIX Bash脚本博客build议 :

 awk '!x[$0]++' 

这个命令只是告诉awk打印哪些行。 variables$0保存一行的全部内容,方括号是数组访问。 因此,对于文件的每一行,如果该节点的内容先前未设置( ! ),则数组x的节点将递增,并打印该行。

一个迟到的答案 – 我只是遇到了这个副本 – 但也许值得添加…

@ 1_CR的答案背后的原理可以写得更简洁,使用cat -n而不是awk来添加行号:

 cat -n file_name | sort -uk2 | sort -nk1 | cut -f2- 
  • 使用cat -n预先添加行号
  • 使用sort -u删除重复的数据
  • 使用sort -n按前缀编号进行sorting
  • 使用cut删除行号

上面的迈克尔·霍夫曼的解决scheme是短暂而甜蜜的。 对于较大的文件,Schwartzian变换方法包括使用awk添加一个索引字段,然后是多轮sort和uniq,这会涉及更less的内存开销。 以下片段在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' 

谢谢1_CR! 我需要一个“uniq -u”(完全删除重复项)而不是uniq(留下一份副本)。 awk和perl解决scheme不能真的被修改来做到这一点,你的可以! 我可能还需要更低的内存使用量,因为我将会像1亿条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' 

从2个文件中删除重复:

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

我只是想删除以下行中的所有重复项,而不是在文件中的任何地方。 所以我用:

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

uniq命令在别名中工作,甚至http://man7.org/linux/man-pages/man1/uniq.1.html