ドイツ語のロケールがあり、カンマを千単位の区切り文字として使用して、米国形式で数字を並べ替える必要があります。ロケールを正しくオーバーライドしていないと思いますか?
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文字セットを使用するなどの特定のロケールを有効にすると、システムに脆弱性が発生する可能性があります(これらの文字セットには、バックティックおよびバックスラッシュ符号化を含む文字符号化があります)。 、それらのいくつかは簡単に脆弱性に変わる可能性があります)。一部のロケールには、一部のソフトウェアでエラーが発生する可能性がある、異常なソート順序または大文字と小文字の変換規則があります。
C
POSIXが保証する唯一のロケールは、POSIX
POSIXシステムにあります(同じでなければなりません)。それ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