bash script2023. 7. 22. 18:52

 

반달가면 이글루에서 백업 - http://bahndal.egloos.com/591503

같은 문자열의 행이 연속될 경우 중복을 제거하거나 중복되는 회수를 확인하기 위해 uniq 명령을 종종 사용하게 된다(uniq의 기본적인 활용에 대한 내용은 이전 게시물을 참고하자. 여기로). 매우 요긴한 기능을 제공하지만, 한글에서는 문제가 발생할 수 있다는 사실을 최근에 발견.

 

아래의 예시를 보자. 글자수가 같으면 동일한 문자열로 간주하는 것처럼 보인다.

# my_data.txt 파일 내용 확인
cat my_data.txt
나비
강아지
메뚜기
메뚜기

# 중복 제거
uniq my_data.txt
나비
강아지

위의 예시에서 "강아지"와 "메뚜기"는 다른 단어임에도 불구하고 uniq에서는 "메뚜기"가 제거되었다. 인터넷을 좀 찾아보니, 지역정보(locale)와 관계가 있는 것으로 의심되는 상황. 리눅스를 설치할 때 언어를 영어로 선택해서 설치하고 한글 폰트와 입력기를 추가해서 사용하고 있기 때문에 그런 모양이다. 현재 사용중인 영어판 + 한글 폰트/입력기 조합에서는 분명 문제가 발생했다.

문자열을 비교할 때 적용하는 지역정보와 관련된 LC_COLLATE 환경변수의 값을 설정해 주면 해결 가능.

# 한글 문자열에 대한 중복 제거
LC_COLLATE="ko_KR.UTF-8" uniq my_data.txt
나비
강아지
메뚜기

ko_KR.UTF-8 대신 C/POSIX 기본값으로 해도 uniq 명령의 결과에 문제가 없었다. 아무래도 영문판으로 설치하면서 설정된 en_US.UTF-8이 문제인 듯.

# LC_COLLATE=C인 경우에도 정상 동작
LC_COLLATE=C uniq my_data.txt
나비
강아지
메뚜기

sort 명령을 이용한 정렬 후 중복제거도 아래의 예시와 같이 해 주면 되겠다. 한글 가나다순으로 정렬하는 것이므로, sort와 uniq 양쪽에 모두 LC_COLLATE 환경변수를 ko_KR.UTF-8로 설정해 주었다.

# 가나다순으로 정렬 후 중복 제거
LC_COLLATE="ko_KR.UTF-8" sort my_data.txt | LC_COLLATE="ko_KR.UTF-8" uniq
강아지
나비
메뚜기

두개의 명령이 파이프(|)로 연결되어 있으므로, 양쪽 명령 모두에 대해 LC_COLLATE 환경변수를 설정해 주어야 한다는 점에 유의하자.

 

728x90
Posted by 반달가면