정렬 및 결합이 작동하지 않는 특정 사례

정렬 및 결합이 작동하지 않는 특정 사례

.dll을 사용하여 아래 링크된 두 파일을 연결하는 데 문제가 있습니다 join -t $'\t' -a1 file_1 file_2. 다음에 설명된 대로 조인이 작동하도록 정렬할 때 특정 플래그를 사용해야 한다는 것을 알고 있습니다.이것그리고이것우편 엽서. 특히 다음 구문을 사용하여 file_1과 file_2를 정렬했습니다 cat file_1 | LANG=en_EN sort k1b,1.

내가 얻는 오류는 다음과 같습니다.

https://drive.google.com/open?id=1vlh9NqD1Nlm6dQi33Qt0gevsLfYxRURN

이것은 문제가 있습니다. 예를 들어, "S2_005_008G1__bin.1" 항목은 file_1과 file_2에 모두 존재하더라도 조인할 수 없습니다.

죄송합니다. 간단한 장난감 예를 들 수는 없지만 손으로 ​​만든 파일로는 이 오류를 재현할 수 없습니다. 이 문제의 원인이 무엇인지 정말로 모르겠습니다.

파일 1,파일_2

답변1

join일치하는 옵션과 로케일을 사용해야 합니다 sort. 탭으로 구분된 필드를 지정하는 경우 탭으로 구분된 필드 join도 지정해야 합니다 sort(기본값은 공백으로 구분됨).

LANG환경 변수 설정은 LC_COLLATE로케일을 설정할 수도 있고 설정하지 않을 수도 있습니다. 환경이 설정되면 환경 변수가 LC_COLLATE우선 적용되고, LANG환경 변수가 설정되면 모든 로케일이 설정됩니다. LC_ALL바라보다LC_*를 설정하지만 LC_ALL은 설정하지 않음

특정 "사람의" 방식으로 파일을 정렬해야 하는 경우가 아니면 C바이트 순서만 사용하는 대조 로케일을 사용하십시오. 다른 다른 로캘이 필요하지 않은 한 나머지 LC_ALL스크립트나 상위 프로세스에서 상속된 설정을 재정의해야 합니다. 그럼에도 불구하고 join및 에 동일한 로케일을 사용해야 합니다 sort.

LC_ALL=C sort -t $'\t' -k 1b,1 file_1 >file_1.sorted
LC_ALL=C sort -t $'\t' -k 1b,1 file_2 >file_2.sorted
LC_ALL=C join -t $'\t' -a1 file_1.sorted file_2.sorted

관련 정보