Mengapa saya mendapatkan output ini dari sortir? [Tutup]

0

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/1kelompok dan yang @ERR894725.10000000/2satu? Kode ASCII untuk /lebih kecil dari nomor apa pun jadi saya tidak melihat mengapa @ERR894725.100000002/1diutamakan @ERR894725.10000000/2.

Saya melihat pola yang sama di seluruh file. Ada kesenjangan antara @ERR894725.10000001/1dan @ERR894725.10000001/1diisi oleh @ERR894725.100000012/1dan @ERR894725.100000012/1dan 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.

DarthPaghius
sumber
2
Sulit mengatakan mengapa Anda melihat output yang diberikan dengan perintah-perintah itu tanpa melihat input.
DopeGhoti
Apa yang terjadi jika Anda menghapus trperintah?
ctrl-alt-delor
2
Cobalah memposting contoh gagal minimal. yaitu menghapus semua karakter tambahan, dan menyederhanakan file input Anda hanya berisi bagian-bagian yang gagal. Akan lebih mudah untuk memecahkan masalah.
Sparhawk
1
Hanya dugaan: Saya ingin tahu apakah file input Anda menggunakan terminator baris yang berbeda dari yang diharapkan utilitas. Apakah Anda mendapatkan hasil yang sama jika Anda menggunakan tr -s '\r' '\n' < reads.fq(untuk mengkonversi semua linebreak ke gaya Unix), bukan cat reads.fq?
Gaultheria
3
Jika ini adalah jenis GNU, Anda dapat menggunakan --debuguntuk melihat apa yang sedang disortir .
muru

Jawaban:

3

Lokal lokal lokal

Anda mendapatkan hasil yang tidak terduga karena lokal default Anda adalah sesuatu selain Catau C.UTF-8.

sortmengurutkan dalam urutan nilai byte hanya di lokal C; di tempat lain, urutkan sortdalam urutan misterius yang ditentukan oleh jiwa yang berniat baik dalam file definisi lokal.

Membandingkan:

$ <<< $'@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

Jika Anda menghargai konsistensi, selalu ucapkan LC_ALL=C sort(atau LC_ALL=C.UTF-8 sort, secara umum LC_ALL=<your-preferred-locale> sort) dan jangan pernah adil sort.

The halaman pengguna telah ini untuk mengatakan:

*** PERINGATAN *** Lokal yang ditentukan oleh lingkungan mempengaruhi urutan sortir. Setel LC_ALL=Cuntuk mendapatkan urutan sortir tradisional yang menggunakan nilai byte asli.

AlexP
sumber
Terima kasih atas jawaban anda. Ini sepertinya bisa menjadi sumber masalah. Saya perlu mengurutkan ulang file yang mungkin memakan waktu satu atau dua hari dan memperbarui hasilnya.
DarthPaghius
Jadi saya berlari LC_ALL=C cat reads.fq | paste - - - - | sort -k1,1 -S 3G | tr '\t' '\n' > sorted_reads.fqdan hasilnya sama. Apakah ini karena pengaturan lokal tidak segera sebelum menelepon sort?
DarthPaghius
LC_ALL=C sort. Atau export LC_ALL=Clalu < reads.fq paste - - - - | sort. Tapi LC_ALL=C cat | paste | sort tidak tidak ditetapkan LC_ALLuntuk sort. (Penjelasan: LC_ALLadalah 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.)
AlexP
Saya melihat. Saya berasumsi LC_ALL=C <command>setara dengan export LC_ALL=C; <command>.
DarthPaghius
Ya, tetapi hanya berlaku untuk <perintah>; dan itu harus menjadi "perintah sederhana", jadi di LC_ALL=C cat | paste - - - - | sortdalamnya berlaku untuk cattetapi tidak untuk pasteatau sort.
AlexP