Sort
為什麼我從排序中得到這個輸出?
我正在使用以下命令鏈對FASTQ 文件進行排序:
cat reads.fq | paste - - - - | sort -k1,1 -S 3G | tr '\t' '\n' > sorted_reads.fq
FASTQ 文件分為四行,其中第一行是我們要排序的 id。
但在輸出中我看到了這種模式:
@ERR894725.10000000/1 AGAAAAAGAAAAATTGTTTCCTGTTATATCCATTTCCTTTAATATAGTTTACAAATTGTGCATTTCAACAGCAGCACTCTGTCCATATGTCTAGCAGACTCCTTAACACACTGTGCTACAACTTCT + <B<<B<<<B<<<<<<<B<B<BB<BB<<<<<BB<BB<BB<B<B0<<<<BBB<<BBB<B<B<BB<<B<BB<B<BB0BB<B<B<<<<<<BB<B<BB<BB<B<BBBBBBB0B<B<BBB<B0B<BB<<07< @ERR894725.100000002/1 AGATAGAGTCTTGCTCTGTCACCCAGCCTGGAGTGCAACGGTGCTATCTCTACTAACTGCAACCTCCGCCCCCCAGGTTCAAGCGATTCTCCTGCCTCAGCCTCCTGAGCAGCTGGGACTACAGTG + <<<<<BB<<<B<<BB<B<B<B<BBBBBBB<BBBB<BBB<7BB<BB<<<B<B<<B<B<B<BBB<<B<B7BBBBBBBBBBB<BBBB'B<B<BB<B<BBBBBBBBBBBBB<BBBBBBBBBB<BB<<<<< @ERR894725.100000002/2 TGTACAGAAAGTATCTGTTTTATTAATTCAACACTGTAAACATTTGCCATGTCTTAAAGTTCAAGTCTCTGTAACCTCCTGAGGTCAGGAGTTTGACATCAGCCTGACCAACATGGTGAAACCCTG + <<<<<B<BB<<<<<<B<<<<<<<<<<<<<B<<B<B<<<<<<B<<<<B<B<<<<B<<<<<<<<<<<B<B<B<B<B<BB<BB<BBBB<BBBBBBBB<B<B<<BBBBB<B<BBB<BBBBBBBBB<<<<< @ERR894725.10000000/2 CTACATAATTTCCCTTACTGGACTAGCTTTTTTTCGGTGCTATTTTAAAATATGTTTAATTCTCCAACTGCTTAGAAGTCTTTTTAGATATTTTGCTGGGTGCAATAGCACACTTTATATCTATAT + 7B<<B<<<<<B<<<B<<<B<<B<B<<BB<<<<<<<7<B<BB<<<<<<B<<<<<<B<<<<<<<<<<BB<B0<B0<0BBBB<BBBBB<<<<<<BBB<BB<<BB<BBB<BBB0<B<BBBBBBBBB<<7< @ERR894725.100000003/1 AAAGAGAGCCCGCATTGCCAAGTCAATCCTAAGCCAAAAGAACAAAGCTGGAGGCATCACGCTACCTGACTTCAAATTATACTACAAGGCTACAGTAACCAAAACAGCATGGTACTGGTACCAAAA + <<<<B<B<<<<7BB<<<BBBBBB<BB<<BB<BBBBBBBBBBB<BBBBBB<BBBBBB<<B<7B<<<BB<B<BB<BBB<B<<<<B<<BB<BBBB<BBB<B<BBBBB<BBBBBBBBB<BBBBB<B<<<B @ERR894725.100000003/2 AAATTTTCTCCCATTCTGTAGGTTGCCTGTTCACTCTGATGGTAGTTTCTTTTGCTGTGCAGAAGCTCTTTAGTTTAATTAGAACCCATTTGTCAATTTTGGCTTTTGTTGCCATTGCTTTTGGTG + <<<<<<<<B<<<B<<<B<<<<<<<<B<B<<<<B<B<B<B<<<<<B<<<<B<<<<BB<<<BB<<<BBB<B<B<BBBB<B<B<BBB<BBB<BB<B<B<<BBB<BBB<BBBBB<B<0BBBBBBBB<<70
@ERR894725.10000000/1
為什麼組和一個之間有差距@ERR894725.10000000/2
?的 ASCII 碼/
小於任何數字,所以我不明白為什麼@ERR894725.100000002/1
優先於@ERR894725.10000000/2
.我在整個文件中看到了相同的模式。有一個間隙,由
@ERR894725.10000001/1
等等@ERR894725.10000001/1
填充。@ERR894725.100000012/1``@ERR894725.100000012/1
任何解釋為什麼會發生這種情況以及避免它的方法都值得讚賞。
** 更新:實際數據非常大(1TB+),無法完整提供。我嘗試再次使用相同的命令對上面的範例進行排序,它給出了正確的結果。我將嘗試使用已經排序的完整輸出來查看它是否可以解決問題。仍然很奇怪為什麼首先會發生這種情況。
當地當地當地
您會得到意想不到的結果,因為您的預設語言環境不是
C
orC.UTF-8
。
sort
僅在 C 語言環境中按字節值的順序排序;在其他語言環境sort
中,按照語言環境定義文件中好心人定義的神秘順序進行排序。比較:
$ <<< $'@ERR894725.10000000/1\t1\n@ERR894725.100000002/1\t2\n@ERR894725.100000002/2\t3\n@ERR894725.10000000/2\t4' \ LC_ALL=en_US.UTF-8 sort -s -k1.1 @ERR894725.10000000/1 1 @ERR894725.100000002/1 2 @ERR894725.100000002/2 3 @ERR894725.10000000/2 4 $ <<< $'@ERR894725.10000000/1\t1\n@ERR894725.100000002/1\t2\n@ERR894725.100000002/2\t3\n@ERR894725.10000000/2\t4' \ LC_ALL=C.UTF-8 sort -s -k1.1 @ERR894725.10000000/1 1 @ERR894725.10000000/2 4 @ERR894725.100000002/1 2 @ERR894725.100000002/2 3
如果您重視一致性,請始終說
LC_ALL=C sort
(或LC_ALL=C.UTF-8 sort
,或一般地說LC_ALL=
<your-preferred-locale>sort
),而永遠不要只說sort
.手冊頁有這樣說:
*** 警告 *** 環境指定的區域設置會影響排序順序。設置
LC_ALL=C
以獲取使用本機字節值的傳統排序順序。