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