如何在其他语言环境中对逗号千分隔的数字进行排序

如何在其他语言环境中对逗号千分隔的数字进行排序

我有德国语言环境,需要使用逗号作为千位分隔符对美国格式的数字进行排序。看来我没有正确覆盖区域设置?

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是 POSIX 保证在 POSIX 系统上找到的唯一语言环境(它们应该是相同的)。它需要thousand_sep该语言环境中的空字符串虽然这意味着它对你的情况没有用。

至少在 GNU 系统上,虽然您无法保证en_US.UTF-8区域设置(或任何其他区域设置)已启用,但通常区域设置的源代码与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

相关内容