join :“파일 2가 정렬되지 않은 상태”


13

_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.
(...)

완전성을 위해 "join --version"및 "sort --version"의 결과를 제공 할 수 있습니까? 어떤 상황에서도 해당 오류 메시지를 표시하기 위해 이전 버전의 gnu join을 얻을 수 없습니다.
브루스 Ediger

3
문제가있는 샘플 데이터 및의 출력을 게시하십시오 locale.
Gilles 'SO- 악마 중지'

답변:


25

나는 함께, 우분투 11.04과 같은 오류가 발생했습니다 sortjoin두 버전 (GNU의로 coreutils) 8.5 인치

그것들은 분명히 양립 할 수 없습니다. 실제로 sort명령에 버그가있는 것 같습니다 . -f( --ignore-case) 옵션의 유무에 따른 차이는 없습니다 . 정렬 할 때는 aaB항상 앞에 aBa있습니다. 영숫자가 아닌 문자도 항상 무시되는 것 같습니다 ( abc이전 ab-x)

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

실제로 이것은 데이터 정렬 순서와 연결되어 있습니다. LANG=en_EN sort -k 1,1 <myfile> ...그런 다음 사용 LANG=en_EN join ...하면 메시지가 제거됩니다.

국제화는 악의 근원이다 ...


따라서 둘 다 사용 LANG=en_EN하면 확실히 작동합니까? 둘 다 동일한 로케일을 사용하는 한 모든 로케일에서 작동합니까? 우리는 차이 말할 수 sortjoin그들이 기본적으로 다른 로케일을 사용하는 것이 무엇입니까?
Aaron McDaid

는 IS -k옵션은 여기에 답하거나, 그것을이다 LANG=en_EN? 정확한 해결책이 무엇인지 확실하지 않습니다.
사용자

5

숫자로 정렬 했습니까? 내가 참여하고있는 열을 제로 패딩하면이 문제가 해결되었다는 것을 알았습니다.

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

5

입력 파일을 올바르게 정렬하고 해당 라인을 쌍으로 묶을 수 있다고 확신하면 위의 오류를 피할 수 있습니다. join --nocheck-order file1.txt file2.txt


4

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

join 지정된 필드 만 키로 사용합니다.

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

조인 매뉴얼 페이지에는 다음이 표시됩니다.

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


2
LOCALE=C sort ...
LOCALE=C join ...

문제가 해결됩니다. @Michael이 지적한 문제는 LOCALE 설정에 따라 데이터 정렬 순서입니다.


2

이 오류가 표시되고 특정 열에서 이미 정렬되어 있고 벽에 대해 머리를 치고있는 경우 (예 : sort -k4,4) sort 명령의 구분 기호도 설정해야합니다.

분명히 OP는 이미 -t ''로이 작업을 수행했지만 일반 탭으로 구분 된 텍스트의 경우 권장합니다.

sort -t $'\t' ...

sort 명령은 탭으로 구분 된 파일처럼 보이는 항목 (특히 정렬중인 열 내에 공백이있는 경우)에서도 기본적으로 공백을 구분 기호로 통합 할 수 있습니다.

정렬 된 데이터를 전달하기 위해 전달하면

join -t $'\t' ...

그런 다음 정렬되지 않은 오류 메시지가 나타납니다. 위에서 언급했듯이 join은 -t ''를 허용하지 않을 수 있습니다.


1

-t 뒤의 인수는 문자입니다. 정렬을 위해 더 긴 정렬 구분 기호를 제공 할 수 있습니다. 나는 당신이 원하는 다른 필드에서 파일을 결합 할 수 있다고 생각하고 사례를 무시하면 우연의 일치로 문제가 해결됩니다.

그리고 Gilles에 동의합니다. 샘플 데이터가 도움이 될 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.