Sort

為什麼我從排序中得到這個輸出?

  • June 12, 2018

我正在使用以下命令鏈對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+),無法完整提供。我嘗試再次使用相同的命令對上面的範例進行排序,它給出了正確的結果。我將嘗試使用已經排序的完整輸出來查看它是否可以解決問題。仍然很奇怪為什麼首先會發生這種情況。

當地當地當地

您會得到意想不到的結果,因為您的預設語言環境不是Cor C.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以獲取使用本機字節值的傳統排序順序。

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