別のロケールでカンマで区切られた数千の数字を並べ替える方法

別のロケールでカンマで区切られた数千の数字を並べ替える方法

ドイツ語のロケールがあり、カンマを千単位の区切り文字として使用して、米国形式で数字を並べ替える必要があります。ロケールを正しくオーバーライドしていないと思いますか?

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

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

関連情報