Join: "파일 2가 정렬 순서가 아닙니다."

Join: "파일 2가 정렬 순서가 아닙니다."

_jeter3.txt와 _jeter1.txt라는 두 개의 파일이 있습니다.

모두 20열 기준으로 정렬되어 있는지 확인했습니다.sort -c

sort -t '     ' -c -k20,20 _jeter3.txt
sort -t '     ' -c -k20,20 _jeter1.txt
#no errors

하지만 두 개의 파일을 원할 때 join두 번째 파일이 정렬되지 않았다는 오류가 발생합니다.

join -t '   ' -1 20 -2 20 _jeter1.txt _jeter3.txt > /dev/null
join: File 2 is not in sorted order

이유를 모르겠습니다.

cat /etc/*-release #FYI
openSUSE 11.0 (i586)
VERSION = 11.0

고쳐 쓰다:' sort -f' 및 join -i(둘 다 대소문자를 구분하지 않음)을 사용하면 문제가 해결됩니다. 그러나 그것은 내 원래 질문을 설명하지 않습니다.

고쳐 쓰다:정렬 및 연결 버전:

> join --version
join (GNU coreutils) 6.11
Copyright (C) 2008 Free Software Foundation, Inc.
(...)

> sort --version
sort (GNU coreutils) 6.11
Copyright (C) 2008 Free Software Foundation, Inc.
(...)

답변1

sortUbuntu 11.04와 버전(GNU coreutils) 8.5 join모두에서 동일한 오류가 발생했습니다 .

그들은 분명히 호환되지 않습니다. 실제로 명령에 뭔가 문제가 있는 것 같습니다. () 옵션이 있든 없든 sort별 차이가 없습니다. 정렬할 때 항상 앞에 옵니다. 영숫자가 아닌 문자도 항상 무시되는 것 같았습니다 (이전)-f--ignore-caseaaBaBaabcab-x

Join은 반대를 기대하는 것 같지만... 해결책이 있습니다.

실제로 이는 정렬 순서와 관련이 있습니다. 메시지를 제거하려면 LANG=en_EN sort -k 1,1 <myfile> ...then을 사용하세요 LANG=en_EN join ....

국제화는 모든 악의 근원입니다... (아무도 이를 명확하게 문서화하지 않았습니다).

답변2

sort기본적으로 전체 행을 키로 사용합니다.

join지정된 필드만 키로 사용하십시오.

조인하려는 키만 사용하도록 정렬을 제한하여 이러한 비호환성을 해결해야 합니다.

Join 매뉴얼 페이지에는 다음과 같이 명시되어 있습니다.

중요사항: FILE1 및 FILE2는 조인 필드에서 순서를 지정해야 합니다. 예를 들어, >'join'에 옵션이 없으면 'sort -k 1b,1'을 사용하십시오. 비교는 "LC_COLLATE"에 지정된 규칙을 따릅니다. > 입력이 정렬되지 않고 일부 행을 연결할 수 없는 경우 경고 메시지가 표시됩니다.

답변3

입력 파일이 올바르게 정렬되었고 해당 행이 쌍을 이룰 수 있다고 확신하는 경우 다음을 실행하여 위의 오류를 피할 수 있습니다.join --nocheck-order file1.txt file2.txt

답변4

숫자로 정렬하는 건가요? 나는 조인하려는 열에 0 패딩을 적용하면 이 문제가 해결된다는 것을 알았습니다.

cat file.txt \
     | awk -F"   " '{ $20=sprintf("%06s", $20); print $0}' \
     | sort > readytojoin.txt

관련 정보