GNU coreutils `sort`가 다르게 동작함

GNU coreutils `sort`가 다르게 동작함

데이터 목록을 정렬하려고 하는데 첫 번째 열인 IP 주소를 기준으로 정렬하겠습니다.

192.168.1.100
192.168.1.101
192.168.1.110
192.168.1.119
192.168.1.20
192.168.1.30
192.168.1.33
192.168.1.54
192.168.1.64
192.168.1.6
192.168.1.91

첫 번째 컴퓨터에서 테스트했는데 sort -n예상대로 작동했습니다.

# coreutils, version: 8.31, release: 23

192.168.1.6
192.168.1.20
192.168.1.30
192.168.1.33
192.168.1.54
192.168.1.64
192.168.1.91
192.168.1.100
192.168.1.101
192.168.1.110
192.168.1.119

하지만 두 번째 컴퓨터에서는 올바르게 정렬되지 않습니다.

# coreutils, version:8.4

192.168.1.100
192.168.1.101
192.168.1.110
192.168.1.119
192.168.1.20
192.168.1.30
192.168.1.33
192.168.1.54
192.168.1.6
192.168.1.64
192.168.1.91

두 컴퓨터 모두 동일한 로케일을 갖습니다.en_US.UTF-8


왜 이런 일이 발생합니까? 어떻게 해결할 수 있나요?

답변1

올바른 키 위치가 없으면 sort행 전체가 키로 사용됩니다. 처음 세 옥텟은 모든 행에서 동일하게 유지되므로 전체 정렬은 마지막 옥텟에 있는 첫 번째 문자의 숫자 위치를 기준으로 합니다. 로 옥텟 앞에 1나타나므로 다른 옥텟보다 먼저 나타납니다 .2100101

올바른 키 위치를 정의하고 숫자 순서를 사용하십시오. 예를 들어, 귀하의 경우 입력 구분 기호를 로 설정 하고 네 번째 필드에서만 작동하도록 .하십시오 . sort이러한 4,4메서드는 4번째 필드로 둘러싸인 4번째 필드에서 시작하여 .동일한 4번째 필드에서 중지됩니다.

sort -n -t'.' -k4,4 file

시스템에 정의된 다른 설정을 재정의하고 localelocal 명령에서 직접 시스템의 기본 설정을 사용할 수도 있습니다. LC_ALL=C바라보다LC_ALL=C효과 는 무엇입니까 ?이유를 이해하다

LC_ALL=C sort -n -t'.' -k4,4 file

감사해요Kamil Machorovsky의 검토이는 실질적인 문제를 강조합니다.

첫 번째 컴퓨터는 locale thousands_sep반환된 로케일을 사용하는 것 같지만 .그렇지 않을 수도 있습니다 en_US.UTF-8(적어도 현재는 그렇지 않습니다 LC_NUMERIC). 두 번째 기계는 .천 단위 구분 기호로 사용되지 않습니다.

관련 정보