정렬 명령의 일관되지 않은 동작

정렬 명령의 일관되지 않은 동작

두 파일을 정렬하고 싶지만 일관된 결과를 얻을 수 없습니다. 데이터 정렬에 문제가 있는 것 같은데 이유를 알 수 없습니다. 예제 파일에서 구분 기호는 공백입니다.

파일 1:

a
b
B
A

파일 2:

a 1
b 0
B 1
A 0

나는 이 파일들을 정렬했는데 sort -k1,1결과는 다음과 같습니다:

정렬 1:

a
A
b
B

정렬 2:

A 0
a 1
b 0
B 1

정렬하려면 해당 파일이 필요하며 join현재 파일 중 하나가 정렬되지 않았다고 불평하고 있습니다.

내 환경에는 설정되어 있지 LC_COLLATE않고 다음으로 설정되어 있습니다 LC_ALL.LANGen_US.UTF-8

출력은 LC_ALL=C sort -k1,1다음과 같습니다

정렬 11:

A
B
a
b

정렬 22:

A 0
B 1
a 1
b 0

특정 순서가 필요하지 않으며 결과를 병합하기만 하면 됩니다. 이 접근 방식은 join효과적입니다. 안전을 위해 join앞에도 추가 할 수 있습니다 LC_ALL=C.

내 질문

sorted1 a너는 왜앞으로 A그리고 sorted2 a뒤쪽에 A? 데이터 정렬이 무엇이든 두 명령 모두에 대해 작동하며 sort두 입력 파일 모두에서 동일한 열 1을 기준으로 정렬하고 있습니다.

추가된 출력ltrace -e strcoll

파일 1

sort->strcoll("B","A") =1
sort->strcoll("a","b") =-1 
sort->strcoll("a","A") =-7
a
sort->strcoll("b","A") =1
A
sort->strcoll("b","B") =-7
b
B
+++ exited (status 0) +++

파일 2

sort->strcoll("B 1","A 0") =1
sort->strcoll("a 1","b 0") =-1 
sort->strcoll("a 1","A 0") =1
A 0
sort->strcoll("a 1","B 1) =-1
a 1
sort->strcoll("b 0","B 1") =-1
b 0
B 1
+++ exited (status 0) +++

답변1

Stéphane Chazelas가 쓴 것처럼논평이는 CentOS/Red Hat의 특정 구현에 있는 버그이며 , 보다 구체적으로 coreutilsGNU 위에 작성하고 적용한 coreutils-8.22-11.el7결함이 있는 국제화 패치( ) 입니다.coreutils-i18n.patchcoreutils-8.22

신고했어요여기CentOS와여기레드햇에게. 이미모두 다 아는Red Hat과 coreutils-8.22-13.el7.

이 제품은 아직 사용할 수 없습니다중앙 운영 체제이때(2015-08-20).

완벽함을 위해 이 버그도 존재한다는 점을 참고하시기 바랍니다(잘못된 버그는 아닙니다).업스트림 보고이에 대한 자세한 정보는 (GNU에서) 찾을 수 있습니다.

답변2

기본 데이터 정렬(en_US.UTF-8)로 인해 이 문제가 발생합니다. 당신은 설정해야LC_COLLATE표시된 대로 텍스트를 정렬하는 값입니다.

 LC_COLLATE='C' sort -k1 file1

관련 정보