정렬 명령의 잘못된 동작?


14

Ubuntu desktop 14.04 (Trusty Tahr) 에서 파일 내용을 정렬하려고했습니다 . 필자의 경우 예상 결과는 원본 내용과 동일해야하지만 실제 결과는 다릅니다. 왜?

# cat test.txt
a++-a
a++-b
a++-c
ab
ac
# cat test.txt | sort
a++-a
ab
a++-b
ac
a++-c

4
당신의 쓸모없는 사용을cat 위해 작은 상을 수여합니다 .
David Foerster

3
@DavidFoerster의 의견은 대체 할 수 있음을 지적하는 재미있는 방법 cat test.txt | sort으로 sort test.txt:
폴커 시겔

@VolkerSiegel : 사실, cat시작 하는 데 유용한 공식이 있지만 사실 입니다. 예를 들어 cat FILE | grep dev | sort"dev"가있는 행만 (정렬 된 순서로) 표시합니다. 를 사용 sort FILE | grep dev하면 동일한 출력이지만 색상이 생성됩니다.
AlainD September

답변:


17

LC_ALL변수를 사용 하여 LC_ALL=C호출 하기 전에 설정할 수 있습니다sort

$ LC_ALL=C sort test.txt
a++-a
a++-b
a++-c
ab
ac

이 마법이 무엇인지 알고 싶다면 대답을 읽으십시오 LC_ALL=C. 다음은 간단한 요약입니다.

C 로케일은 가장 단순한 로케일이되는 특수 로케일입니다. 다른 로케일은 사람을위한 것이지만 C 로케일은 컴퓨터를위한 것이라고 말할 수도 있습니다. C 로케일에서 문자는 단일 바이트이고 문자 세트는 ASCII이며 정렬 순서는 바이트 값을 기반으로합니다.

또한 @KenMollerup이 지적한 것처럼 man sort

   ***  WARNING  ***  The locale specified by the environment affects sort
   order.  Set LC_ALL=C to get the traditional sort order that uses native
   byte values.

따라서 sort with를 사용할 때는 LC_ALL=C심볼을 바이트 단위로 정렬하십시오. 그렇지 않으면 sort영숫자가 아닌 모든 문자를 무시합니다.


이것을 보지 못해서 의견에 반응했습니다!
Ken Mollerup

@KenMollerup을 (를) 주셔서 감사합니다 man sort. 나는 그것을 알아 차리지 못했다
c0rp

8

정렬은 알파벳 순서와 숫자 정렬을 사용합니다. 우리와 마찬가지로 +-<> ...와 같은 특수 문자는 무시되고 숫자는 1, 2, 3과 같이 숫자로 처리됩니다. 11, 12 1066 1104 이전-참조!

따라서 목록은 aa, ab, ab, ac, ac로 표시됩니다.


test.txt가 원하는 방식으로 정렬하는 특수 문자를 무시하지 않도록 정렬 옵션이 있습니까?
Doug Smythies

6
*** 경고 *** 환경에서 지정한 로케일은 정렬 순서에 영향을줍니다. 기본 바이트 값을 사용하는 기존 정렬 순서를 얻으려면 LC_ALL = C를 설정하십시오.
Ken Mollerup

@ KenMollerup, 귀하의 답변에 더 많은 정보를 추가하십시오. 에서 인용을 man sort추가하고 예를 추가하십시오.
c0rp

예,하지만 너무 느 렸습니다. 아래 c0rp의 답변을 참조하십시오.
Ken Mollerup
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.