대소 문자 구분으로 GNU 정렬


35

sortUbuntu 10.04 (Lucid) 의 유틸리티는 사용자가 지정한 것처럼 항상 대소 문자를 구분하지 않고 정렬 --ignore-case합니다.

The two sort just give the same result: 

echo -e "c\nb\nB\na" | sort
echo -e "c\nb\nB\na" | sort --ignore-case

그러나 때로는 대소 문자를 구분하여 정렬하기를 원하므로 대문자가 먼저오고 소문자가 먼저 나타납니다. 가능합니까?

답변:


31

데이터 정렬 순서를 재정의합니다.

echo -e "c\nb\nB\na" | LC_COLLATE=C sort

5
이것은 작동하지만 외국 문자가없는 경우에만 정의에 따라 작동합니다. 플레이 중입니다. 그들은 7 비트 ASCII 문자 다음 에 정렬됩니다 . 시도하십시오 echo $'B\nÄ\nb\na' | LC_COLLATE=C sort. 로케일 sort이 아닌 GNU 가 항상 대소 문자를 구분하지 않는 정렬을 수행 한다는 사실을 버그 로 간주해서는 안 됩니까? C
mklement0

"외부 문자"와 관련하여 C.UTF-8로케일 ( LC_COLLATE=C.UTF-8)은 ASCII가 아닌 UTF-8 문자를 "일반적으로"처리하는 동안 대소 문자를 구분하여 정렬합니다. 불행히도 glibc에서는 업스트림으로 제공되지 않으며 데비안, 우분투 및 파생 제품에서만 패치됩니다.
대체

13

흥미롭게도 다음과 같이 또 다른 정렬 순서를 사용할 수 있습니다.

echo -e "c\nb\nB\na" | LC_COLLATE=C sort --ignore-case

대문자를 해당하는 소문자 앞에 넣습니다.

다음은 en_US.UTF-8로케일 에서 출력을 비교 한 것입니다 ( "d"와 "D"를 추가했습니다) (재정의 된 경우 제외).

  1. echo -e "d\nD\nc\nb\nB\na" | sort
  2. echo -e "d\nD\nc\nb\nB\na" | sort --ignore-case
  3. echo -e "d\nD\nc\nb\nB\na" | LC_COLLATE=C sort
  4. echo -e "d\nD\nc\nb\nB\na" | LC_COLLATE=C sort --ignore-case

산출:

1   2   3   4
-   -   -   -
a   a   B   a
b   b   D   B
B   B   a   b
c   c   b   c
d   d   c   D
D   D   d   d

흥미있는; 나는 GNU에서이 동작 참조 sort v5.93(OS X 10.9.3 (함께 제공됩니다!)) 및 v8.13있지만에서 v8.21v8.22. 나는 2와 4의 결과가 여전히 동등한 것으로 간주 될 수 있다고 생각합니다 (그러나 외래 문자를 추가하면 분명히 바뀔 것입니다).
mklement0
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.