Memory

連接數千個已經排序的文件并快速重新排序輸出文件

  • August 26, 2019

我有 ~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 中使用普通命令行來處理這個問題?

如果文件已經以可接受的方式排序,您可以對它們進行合併排序,然後對它們進行排序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選項)。這些排序欄位需要與輸入文件的排序方式相匹配。

引用自:https://unix.stackexchange.com/questions/537499