我有一个大文件50G,我想要获取其中的重复行和剩余部分。我使用了两个命令来获取结果,但这需要很长时间。
sort file.tsv | uniq -d > duplicateList.tsv
sort file.tsv | uniq -u > clean_List.tsv
从上面可以看到,这个过程重复了两次,我想只使用一个命令并返回两个结果而不使用重复的命令。
注意,我可以使用Linux命令或Python脚本。
哈希是迄今为止最快的。以下是用Python实现哈希算法的方法:
name = '/my/big/file'
lines = dict()
dups = dict()
with open( name ) as f:
line = line.rstrip()
for line in f:
if line in lines:
dups[ line ] = True
else:
lines[ line ] = True
print( 'Duplicate(s)' )
for line in dups:
print( line )
print( 'Unique(s)' )
for line in lines:
if line not in dups:
print( line )
Python字典是作为一个哈希集合实现的。
这个可能适用于你(GNU sed),假设文件已经排序:
sed -Ee 'N;/^(.*)\n\1$/!{P;D};:a;$w duplicatesFile' \
-e '$d;N;/(\n.*)\1$/ba;h;s/.*\n/\n/;x;s/(.*)\n.*/\1/w duplicatesFile' \
-e 'x;D' file > nonduplicatesFile
我认为你正在寻找这个语法:
sort file.tsv > >(uniq -d > duplicateList.tsv) > >(uniq -u > clean_List.tsv)
它将stdout发送到两个命令,因此只会进行一次排序,而另外两个命令则并行执行。
tee
命令吗?它可以将文件内容传输到不同的消费者或文件中。 - alberttee
以及为什么它“无法工作”。请展示一些代表性的TSV文件行。谢谢。 - Mark Setchell