次のコマンドチェーンペアを使用していますFASTQファイル:
cat reads.fq | paste - - - - | sort -k1,1 -S 3G | tr '\t' '\n' > sorted_reads.fq
FASTQファイルは4行のグループに分かれており、最初の行はソートしたい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
ロケール ロケール ロケール
C
デフォルトのロケールがまたはそうでないため、予期しない結果が発生しますC.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
デフォルトのバイト値を使用して既存のソート順序を取得するように設定します。