LC_COLLATE를 사용하여 소문자가 대문자 앞에 오도록 정렬 순서를 지정합니다.

LC_COLLATE를 사용하여 소문자가 대문자 앞에 오도록 정렬 순서를 지정합니다.

주어진 파일:

$ cat file
1
a
C
B
2
c
3
A
b

기본적으로 sort다음과 같습니다.

$ sort file
1
2
3
a
A
b
B
c
C

그러면 LC_COLLATE=C대문자가 소문자보다 먼저 정렬됩니다.

$ LC_COLLATE=C sort file
1
2
3
A
B
C
a
b
c

대소문자 역순(예: 숫자, 소문자, 대문자 순)으로 정렬할 수 있나요?

답변1

기본적으로 해당 순서로 정렬되는 로케일을 알지 못합니다. 해결책은 사용자 정의 정렬 순서를 사용하여 사용자 정의 로캘을 만드는 것입니다. 4년 후의 누군가가 맞춤형 방식으로 정리하고 싶다면 여기에 요령이 있습니다.

대부분의 로케일은 자체 정렬 순서를 지정하지 않고 대신 /usr/share/i18n/locales/iso14651_t1_common편집하려는 경우를 대비해 로케일에 정의된 정렬 순서를 복사합니다. iso14651_t1_common거의 모든 로케일의 정렬 순서를 변경하려면 원본 파일을 수정하는 것보다 복사본을 만드는 것이 좋습니다. 정렬 순서가 작동하는 방식과 $HOME루트 액세스 없이 디렉터리에 사용자 지정 로캘을 만드는 방법에 대한 자세한 내용은 다음을 참조하세요.이 비슷한 질문에 대한 답변에서.

다음 항목에 따라 a합계가 어떻게 정렬되는지 확인하세요 .Aiso14651_t1_common

<U0061> <a>;<BAS>;<MIN>;IGNORE # 198 a
<U0041> <a>;<BAS>;<CAP>;IGNORE # 517 A

b그리고 B비슷합니다:

<U0062> <b>;<BAS>;<MIN>;IGNORE # 233 b
<U0042> <b>;<BAS>;<CAP>;IGNORE # 550 B

우리는 첫 번째 패스에서 와 둘 다 조합 기호 를 a갖고 , 둘 다 조합 기호 를 가지고 있음 을 알 수 있습니다 . 이전에 나타나며 이전 과 병치 되기 때문입니다 . 두 번째 패스에서는 네 문자 모두 조합 기호가 있기 때문에 동점을 끊지 않지만, 세 번째 패스에서는 소문자에 대한 조합 기호가 대문자에 대한 조합 기호(3467행) 앞에 있는 라인 3467에 나타나기 때문에 동점이 해결됩니다. ).3488라인). 따라서 정렬 순서는 , , 가 됩니다.A<a>bB<b><a><b>iso14651_t1_commonaAbB<BAS><MIN><CAP>aAbB

첫 번째와 세 번째 조합 기호를 바꾸면 문자를 먼저 대소문자(작은 것 큰 것)로 정렬한 다음 악센트( <BAS>악센트가 없는 경우)로 정렬한 다음 알파벳순으로 정렬합니다. 하지만, <MIN>그리고 <CAP>모두 숫자 앞에 있으므로 문자 뒤에 숫자를 배치하는 바람직하지 않은 효과가 있습니다.

만들 때 숫자를 먼저 넣는 가장 쉬운 방법모두소문자 먼저모두대문자가 하는 일은 첫 번째 비교 중에 모든 문자를 동일하게 설정하여 연결하는 것입니다 <a>. 대소문자 내에서 알파벳순으로 정렬되도록 하려면 마지막 대조 기호를 IGNORE현재 첫 번째 대조 기호로 변경하십시오. 이 패턴을 따르면 다음 a과 같습니다.

<U0061> <a>;<BAS>;<MIN>;<a> # 198 a

A될 것입니다:

<U0041> <a>;<BAS>;<CAP>;<a> # 517 A

b될 것입니다:

<U0062> <a>;<BAS>;<MIN>;<b> # 233 b

B될 것입니다:

<U0042> <a>;<BAS>;<CAP>;<b> # 550 B

나머지 글자들에 대해서도 마찬가지입니다.

사용자 정의 버전을 만든 후 iso14651_t1_common다음 지침을 따르세요.위에 링크된 답변사용자 정의 로케일을 컴파일하십시오.

답변2

LC_COLLATE=C대문자를 소문자보다 먼저 정렬하는 설정이 항상 충분하지는 않습니다. 설정해야 할 수도 있습니다 LC_ALL=C.

이는 영숫자가 아닌 문자와 인쇄할 수 없는 문자도 고려하지만 해당 옵션을 원하지 않는 경우 ( 에서 설명 ) -d이 옵션을 끕니다.-iman sort

그러나 멀티바이트 입력(예: ASCII가 아닌 문자가 포함된 UTF-8)에서는 심각한 오류가 발생할 수 있습니다.

대문자(순서대로) 이전에 소문자(순서대로)를 얻기 위해 내가 생각할 수 있는 가장 좋은 방법은 정렬하기 전에 모든 문자의 대소문자를 반전한 다음 다시 반전시키는 것입니다. 이는 본격적인 프로그래밍 언어를 손상시키지 않는 것입니다. 그 다음에.

tr 'a-zA-Z' 'A-Za-z' < file | LC_ALL=C sort | tr 'a-zA-Z' 'A-Za-z'

답변3

저는 전문가는 아니지만 이와 같은 로케일 정의 데이터 정렬을 본 적이 없습니다. AFAIK 이 데이터 정렬은 C 기반에서만 작동합니다.ASCII 값. (일반적으로 이 문제는 스크립트를 통해 해결합니다.)

하지만 저는 이것을 해본 적이 없습니다. 하지만 한 번 살펴보고 싶을 수도 있습니다.지역 정의(1)그리고로케일(5)로케일을 정의하고 궁극적으로 자신만의 로케일을 정의하는 방법을 알아보려면 맨페이지를 참조하세요.

또한 발음 구별 부호나 특수 문자가 있는 경우 C 로케일은 이를 원하는 방식으로 처리하지 않는다는 점을 잊지 마십시오. 예를 들어 á"near" a또는 Ł"near" 는 배치되지 않습니다 L. 이 경우 언어의 로캘이 더 나은 출발점이 될 수 있습니다.

답변4

LC_COLLATE="en_US.UTF-8" sort file

관련 정보