Saya menggunakan rantai perintah berikut untuk mengurutkan file FASTQ :
cat reads.fq | paste - - - - | sort -k1,1 -S 3G | tr '\t' '\n' > sorted_reads.fq
File FASTQ dipisahkan menjadi grup-grup untuk empat baris yang pertama adalah id yang ingin kami urutkan.
Tetapi dalam output saya melihat pola ini:
@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
Mengapa ada celah antara @ERR894725.10000000/1
kelompok dan yang @ERR894725.10000000/2
satu? Kode ASCII untuk /
lebih kecil dari nomor apa pun jadi saya tidak melihat mengapa @ERR894725.100000002/1
diutamakan @ERR894725.10000000/2
.
Saya melihat pola yang sama di seluruh file. Ada kesenjangan antara @ERR894725.10000001/1
dan @ERR894725.10000001/1
diisi oleh @ERR894725.100000012/1
dan @ERR894725.100000012/1
dan sebagainya.
Penjelasan mengapa hal ini terjadi dan cara untuk menghindarinya sangat dihargai.
** Pembaruan: Data aktualnya cukup besar (1TB +) dan tidak dapat disediakan secara keseluruhan. Saya mencoba menyortir contoh di atas menggunakan perintah yang sama lagi dan memberikan hasil yang benar. Saya akan mencoba menggunakan output lengkap yang sudah diurutkan untuk melihat apakah itu memperbaiki sesuatu. Masih aneh mengapa ini terjadi.
tr
perintah?tr -s '\r' '\n' < reads.fq
(untuk mengkonversi semua linebreak ke gaya Unix), bukancat reads.fq
?--debug
untuk melihat apa yang sedang disortir .Jawaban:
Lokal lokal lokal
Anda mendapatkan hasil yang tidak terduga karena lokal default Anda adalah sesuatu selain
C
atauC.UTF-8
.sort
mengurutkan dalam urutan nilai byte hanya di lokal C; di tempat lain, urutkansort
dalam urutan misterius yang ditentukan oleh jiwa yang berniat baik dalam file definisi lokal.Membandingkan:
Jika Anda menghargai konsistensi, selalu ucapkan
LC_ALL=C sort
(atauLC_ALL=C.UTF-8 sort
, secara umumLC_ALL=
<your-preferred-locale>sort
) dan jangan pernah adilsort
.The halaman pengguna telah ini untuk mengatakan:
sumber
LC_ALL=C cat reads.fq | paste - - - - | sort -k1,1 -S 3G | tr '\t' '\n' > sorted_reads.fq
dan hasilnya sama. Apakah ini karena pengaturan lokal tidak segera sebelum meneleponsort
?LC_ALL=C sort
. Atauexport LC_ALL=C
lalu< reads.fq paste - - - - | sort
. TapiLC_ALL=C cat | paste | sort
tidak tidak ditetapkanLC_ALL
untuksort
. (Penjelasan:LC_ALL
adalah variabel lingkungan. Anda dapat mengatur variabel seperti itu sebagai perintah terpisah dan kemudian akan berlaku di semua perintah berikutnya, atau Anda dapat mengaturnya sementara untuk hanya satu perintah.)LC_ALL=C <command>
setara denganexport LC_ALL=C; <command>
.LC_ALL=C cat | paste - - - - | sort
dalamnya berlaku untukcat
tetapi tidak untukpaste
atausort
.