为什么我要从排序中获取此输出?

为什么我要从排序中获取此输出?

我正在使用以下命令链对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+),无法完整提供。我尝试再次使用相同的命令对上面的示例进行排序,它给出了正确的结果。我将尝试重新排序已经排序的完整输出,看看它是否可以解决问题。仍然很奇怪为什么会发生这种情况。

答案1

区域设置 区域设置 区域设置

您会得到意外的结果,因为您的默认区域设置不是CC.UTF-8

sort仅在 C 语言环境中按字节值的顺序排序;在其他语言环境中,sort按照语言环境定义文件中善意的灵魂定义的神秘顺序进行排序。

比较:

$ <<< $'@ERR894725.10000000/1\t1\[email protected]/1\t2\[email protected]/2\t3\[email protected]/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\[email protected]/1\t2\[email protected]/2\t3\[email protected]/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为获取使用本机字节值的传统排序顺序。

相关内容