Eu tenho uma localidade alemã e preciso classificar os números formatados nos EUA com vírgulas como separador de milhares. Parece que eu não substituo a localidade corretamente?
sort --version
sort (GNU coreutils) 8.30
Exemplo:
echo "-4.00\n40.00\n4,000.00"|LC_ALL=en_US.utf8 sort -h
-4.00
4,000.00
40.00
Na verdade, não espero que mude a ordem, pois 4,000
é a maior.
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=
Uma explicação possível é que essa
en_US.utf8
localidade não está disponível em seu sistema.Você pode usar
locale -a
para obter a lista de localidades disponíveis,locale -a | grep en_US
para a lista de locais em inglês dos EUA.Se esse locale foi instalado,
LC_ALL=en_US.utf8 locale -k LC_NUMERIC
produziria algo como:e
LC_ALL=en_US.utf8 locale thousands_sep
produziria,
.Caso contrário, você provavelmente obteria um erro sobre o local não estar disponível.
Se estiver no Debian, você pode selecionar com quais localidades deseja habilitar (as
root
):Evite habilitar todas as localidades possíveis; habilitar algumas localidades como aquelas que usam os conjuntos de caracteres BIG5, BIG5HKSCS ou GB18030, introduziria algumas vulnerabilidades em seu sistema (esses charsets possuem caracteres cuja codificação contém a codificação de backtick e backslash causando todos os tipos de bugs, alguns dos quais facilmente se transformam em vulnerabilidades). Algumas localidades têm ordens de classificação incomuns ou regras de conversão de maiúsculas e minúsculas que também podem atrapalhar alguns softwares.
Observe que
C
ePOSIX
são as únicas localidades (elas devem ser as mesmas) que o POSIX garante ser encontrado em sistemas POSIX. Requer que seja athousand_sep
string vazia nessa localidade , o que significa que não é útil no seu caso.Em sistemas GNU, pelo menos, embora você não tenha nenhuma garantia de que o
en_US.UTF-8
locale (ou qualquer outro locale) esteja ativado, geralmente a fonte para o locale está disponível junto com olocaledef
comando para compilá-lo, então você deve poder compilar isso locale em um diretório temporário como um usuário normal. Por exemplo, você pode definir umus-sort
script como:Isso compilaria essa localidade em um diretório temporário quando não estiver disponível e seria executado
sort
nele. Isso seria lento, pois compilar uma localidade é uma operação cara.Hm, isso funciona muito bem para mim. Estou no CentOS7.