.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
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