linux sort 에서 한글 정렬 결과가 잘못 나올때
한글이 섞여 있는 파일을 sort로 정렬할때 결과의 순서가 이상할때가 있다.
이런경우 LC_COLLATE
환경변수를 바꿔서 한글순서 정렬이 가능하다.
(LC_ALL
은 LC_*
계열 환경변수를 모두 바꾸므로 LC_ALL
에 설정해도 무방)
한글 UTF-8 기준으로 정렬하려면 LC_COLLATE="ko_KR.utf8"
로 설정하면 된다.
# centos 7.2, GNU coreutils 8.22
$ cat text
바d
가l
자e
사m
다n
하g
나j
파h
타c
카f
아i
차b
마k
라a
$ sort text
라a
차b
타c
바d
자e
카f
하g
파h
아i
나j
마k
가l
사m
다n
$ C_COLLATE="ko_KR.UTF-8" sort text
가l
나j
다n
라a
마k
바d
사m
아i
자e
차b
카f
타c
파h
하g
$ LC_COLLATE="C" sort text
가l
나j
다n
라a
마k
바d
사m
아i
자e
차b
카f
타c
파h
하g
LC_COLLATE
를 C
, POSIX
로 설정하면 strcmp
기준으로 정렬을 하는데
한글만 포함된경우 문제가 없으나 영문 대소문자도 아스키코드 기준으로 정렬하니 주의해야 한다.
$ cat en
a
C
D
b
A
d
$ sort en # LC_COLLATE="en_US.UTF-8"
a
A
b
C
d
D
$ LC_COLLATE='posix' sort en
A
C
D
a
b
d
추가로 macOS 에서는 위 LC_COLLCATE=ko_KR.UTF-8
적용이 안되고 C
, POSIX
로도 안되는데…
비정상 locale 값을 적어서 strcmp
기준으로 정렬은 가능하다.