Linux의 정렬 문제

Linux의 정렬 문제

유전자 이름과 발현 값으로 파일을 정렬하고 있습니다. 모든 파일의 정확한 라인 수는 동일하지만, 정렬 후 일부 유전자의 위치에 차이가 있습니다. 이것은 매우 이상합니다. 다음은 이러한 두 파일의 정렬된 버전입니다.

예를 들어:

Cxx1c   25.1695
Cxxc1   15.2228
Cxxc4   0.952061
Cxxc5   3.13309
**Cyb5  157.426**
Cyb561  0.425933
Cyb561a3    9.55082
Cyb561d1    4.00422
Cyb561d2    3.04411
Cyb5b   16.7622
Cyb5d1  7.25191
Cyb5d2  2.85109
Cyb5r1  15.2511
Cyb5r2  0.48748

다른 파일에도 이런 정렬이 있습니다. 기본적으로 이 파일에서는 Cyb5가 Cyb561d2 유전자 뒤에 존재합니다. 어떻게 정확히 동일한 정렬 순서를 가질 수 있습니까? 이와 같은 작업을 수행하는 매개변수가 있나요?

Cxx1c   44.9795
Cxxc1   19.0346
Cxxc4   1.17429
Cxxc5   2.71589
**Cyb561    7.11003**
Cyb561a3    1.97601
Cyb561d1    2.13004
Cyb561d2    2.03376
Cyb5    64.074
Cyb5b   14.5329
Cyb5d1  12.0212
Cyb5d2  1.47763
Cyb5r1  10.5463
Cyb5r2  0

위의 정렬된 파일을 생성하는 코드는 다음과 같습니다.

for i in *.txt; do
    sort  -d $i >$i.sort
done

답변1

Cyb5 157.426첫 번째 정렬 단계에서는 로케일 공백이 무시되므로 먼저 정렬 Cyb561 0.425933하고 Cyb5 64.074마지막으로 정렬하므로 순서가 영어 사전 순서에 더 가깝습니다.Cyb561 7.11003

예를 들어, 사전에서는 a priori및 사이에서 찾을 수 있습니다.apiaryArrival

여기서는 Cyb5 157.426첫 번째 패스와 비교합니다. 왜냐하면 Cyb561 0.425933첫 번째 패스와 첫 번째 패스를 비교 Cyb5157.426하기 때문입니다.Cyb5610.425933무게공백 문자는소홀히 하다.

이러한 특수 처리를 피하려면 C문자 코드 포인트 값만을 기준으로 하는 순서로 로케일을 변경할 수 있습니다.

LC_ALL=C sort -d file

또는 @Swiss가 말했듯이 첫 번째 필드만 정렬합니다.

sort -d -k1,1 file

그러나 필드 구분 기호는 공백이 아닌 공백에서 공백으로의 전환이며 공백은 공백입니다.필드에 포함됩니다.

그래서:

 b x
a x

sort -d -k1,1여전히 다음과 같이 정렬됩니다 .

a x
 b x

귀하의 로케일에서는 공백이 무시되기 때문에 다음과 같습니다.

 b x
a x

C 로케일에서는 공백 문자가 먼저 옵니다 a.

-b로케일에 관계없이 선행 공백이 항상 무시되도록 옵션을 추가할 수 있습니다 . 또는 공백으로 시작하는 줄을 먼저 정렬하려면 로케일을 C로 수정하세요.

답변2

현재 전체 행을 정렬하고 있는데 첫 번째 열만 정렬하려는 것 같습니다. 현재 명령이 작성되는 방식에 따라 열은 기본적으로 함께 연결됩니다. 예를 들면 다음과 같습니다.

Cyb5    157.426  -> Cyb5157426
Cyb561  0.425933 -> Cyb5610425933

그리고

Cyb561  7.11003 -> Cyb561711003
Cyb5    64.074  -> Cyb564074

첫 번째 열만 정렬하려면 다음 명령을 사용해야 합니다.

sort -d -k1,1

관련 정보