정렬에서 이 출력을 얻는 이유는 무엇입니까? [폐쇄]

정렬에서 이 출력을 얻는 이유는 무엇입니까? [폐쇄]

다음 명령 체인 쌍을 사용하고 있습니다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기본 바이트 값을 사용하여 기존 정렬 순서를 가져오도록 설정합니다 .

관련 정보