连接数千个已排序的文件并快速重新排序输出文件

连接数千个已排序的文件并快速重新排序输出文件

我有大约 100000 个文件,每个文件都有独特的行,例如:

文件1.txt

chr1_1_200  
chr1_600_800  
...

文件2.txt

chr1_600_800  
chr1_1000_1200  
...

文件3.txt

chr1_200_400    
chr1_600_800  
chr1_1000_1200  
...  

每个文件大约有 3000 万行,何时执行命令:

cat *txt | sort -u > Unique_Position.txt

系统内存不足。在 Linux 中如何使用普通命令行来处理这个问题?

答案1

如果文件已经以可接受的方式排序,您可以对它们进行合并排序,然后对uniq它们进行排序:

sort -t_ -k2,2n -k3,3n -m -- *.txt | uniq > Unique_Position.txt

...它对第二个字段进行数字排序(由下划线分隔_),如果这些键是唯一的,则按第三个字段进行排序。然后将生成的输出通过管道传输,uniq然后重定向到输出文件。

鉴于上面的(简短)示例输入,结果为:

chr1_1_200
chr1_200_400
chr1_600_800
chr1_1000_1200

如果您能够完全指定要保留的行的排序字段,则可以sort通过添加-u选项来完成所有操作:

sort -t_ -k1 -k2,2n -k3,3n -m -u *.txt > Unique_Position.txt

这将保留三个列出字段之间的唯一行,而无需调用uniq(注意添加了该-u选项)。这些排序字段需要与输入文件的排序方式相匹配。

相关内容