다른 로케일에서 쉼표로 구분된 수천 개의 숫자를 정렬하는 방법

다른 로케일에서 쉼표로 구분된 수천 개의 숫자를 정렬하는 방법

독일어 로캘이 있고 쉼표를 천 단위 구분 기호로 사용하여 미국 형식으로 숫자를 정렬해야 합니다. 로캘을 올바르게 재정의하지 않은 것 같나요?

sort --version
sort (GNU coreutils) 8.30

예:

echo "-4.00\n40.00\n4,000.00"|LC_ALL=en_US.utf8 sort -h
-4.00
4,000.00
40.00

4,000실제로 나는 가장 큰 순서를 변경하고 싶지 않습니다 .

locale
LANG=de_DE.UTF-8
LANGUAGE=
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME=de_DE.utf8
LC_COLLATE="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_PAPER="de_DE.UTF-8"
LC_NAME="de_DE.UTF-8"
LC_ADDRESS="de_DE.UTF-8"
LC_TELEPHONE="de_DE.UTF-8"
LC_MEASUREMENT="de_DE.UTF-8"
LC_IDENTIFICATION="de_DE.UTF-8"
LC_ALL=

답변1

한 가지 가능한 설명은 en_US.utf8시스템에서 로케일을 사용할 수 없다는 것입니다.

locale -a사용 가능한 로케일 목록, locale -a | grep en_US즉 미국 영어 로케일 목록을 가져오는 데 사용할 수 있습니다 .

로케일이 설치된 경우 LC_ALL=en_US.utf8 locale -k LC_NUMERIC다음과 유사한 출력이 나타납니다.

decimal_point="."
thousands_sep=","
grouping=3;3
numeric-decimal-point-wc=46
numeric-thousands-sep-wc=44
numeric-codeset="UTF-8"

그리고 LC_ALL=en_US.utf8 locale thousands_sep출력될 것입니다 ,.

그렇지 않으면 로캘을 사용할 수 없다는 오류가 발생할 수 있습니다.

Debian에서는 활성화할 로케일을 선택할 수 있습니다(예 root: ):

dpkg-reconfigure locales

가능한 모든 로케일을 활성화하지 마십시오. BIG5, BIG5HKSCS 또는 GB18030 문자 세트를 사용하는 것과 같은 특정 로케일을 활성화하면 시스템에 취약점이 발생할 수 있습니다(이러한 문자 세트에는 백틱 및 백슬래시 인코딩을 포함하는 문자 인코딩이 있음). , 그 중 일부는 쉽게 취약점으로 변할 수 있습니다). 일부 로케일에는 일부 소프트웨어에서 오류를 일으킬 수도 있는 비정상적인 정렬 순서 또는 대소문자 변환 규칙이 있습니다.

CPOSIX가 보장하는 유일한 로캘 은 POSIXPOSIX 시스템에서 찾을 수 있습니다(동일해야 함). 그것thousand_sep이 로케일에는 빈 문자열이 필요합니다이는 귀하의 경우에는 유용하지 않음을 의미합니다.

en_US.UTF-8적어도 GNU 시스템에서는 로케일(또는 다른 로케일)이 활성화된다는 보장은 없지만 일반적으로 로케일의 소스 코드는 localedef이를 컴파일하는 명령과 함께 사용할 수 있으므로 다음과 같이 로케일을 컴파일할 수 있어야 합니다. 일반 사용자는 임시 디렉터리에 로케일을 설정합니다. 예를 들어 us-sort스크립트를 다음과 같이 정의할 수 있습니다.

#! /bin/sh -

if l=$(locale -a | grep -ixm1 -e en_US.UTF-8 -xe en_US.utf8) && false; then
  LC_ALL=$l exec sort "$@"
else
  d=$(mktemp -d) || exit
  trap 'rm -rf -- "$d"' INT TERM HUP EXIT

  localedef -i en_US -f UTF-8 -- "$d/en_US.UTF-8" &&
    LOCPATH=$d LC_ALL=en_US.UTF-8 sort "$@"
fi

로케일을 사용할 수 없는 경우 임시 디렉토리에서 로케일을 컴파일하고 sort그곳에서 실행합니다. 그러나 로케일을 컴파일하는 작업은 비용이 많이 들기 때문에 속도가 느려집니다.

답변2

글쎄, 이것은 나에게 정말 잘 작동합니다. 내 것은 CentOS7입니다.

[root@poligon ~]# echo -e "-4.00\n40.00\n4,000.00" |LC_ALL=en_US.utf8 sort -h
-4.00
40.00
4,000.00
[root@poligon ~]# 
[root@poligon ~]# sort --version
sort (GNU coreutils) 8.22

관련 정보