我有一个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的系统上这个功能
在UNIX猛砸脚本博客建议 :
awk '!x[$0]++'
此命令告诉awk的线条打印的。 变量$0
保持线的全部内容和方括号是数组访问。 因此,对于文件的每一行,该阵列的节点x
被增量,(行打印如果该节点的含量不!
)预先设定。
逾期答案 - 我只是碰到了这样一个重复的 - 但也许值得加入...
@后面1_CR的回答可以更简明地写,使用原则cat -n
而不是awk
添加行号:
cat -n file_name | sort -uk2 | sort -nk1 | cut -f2-
- 用
cat -n
前面加上行号 - 使用
sort -u
删除重复数据 - 使用
sort -n
以数字预谋排序 - 使用
cut
去除行号
上述迈克尔·霍夫曼的解决方案是简短而亲切。 对于大文件,使用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'
从2个文件删除重复的:
awk '!a[$0]++' file1.csv file2.csv
谢谢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'
我只是想取消对以下各行的所有副本,不是到处在文件中。 所以我用:
awk '{
if ($0 != PREVLINE) print $0;
PREVLINE=$0;
}'
在uniq
在alias命令作品甚至http://man7.org/linux/man-pages/man1/uniq.1.html
现在,你可以检查出是写在小锈工具: UQ 。
它执行的唯一性的滤波,而无需先排序的输入,因此可应用在连续流。