Classificando numericamente em um arquivo delimitado por vírgula com Unix

8

Eu tenho um arquivo separado por vírgulas que se parece com isso:

100,00869184
6492,8361
1234,31
200,04071

Eu quero usar sort para classificar este arquivo numericamente somente pela primeira coluna .

Resultado desejado:

100,00869184
200,04071
1234,31
6492,8361

Como faço para conseguir isso usando a classificação? Parece que as vírgulas estão sendo tratadas como separadores de milhares em vez de delimitadores, mesmo quando eu os chamo como tal.

Tanto sort -t',' -n quanto sort -t',' -nk1' me dão isso:

1234,31
200,04071
6492,8361
100,00869184

Classificar pelo padrão (sem parâmetros) ou usar sort -t',' me dá isso:

100,00869184
1234,31
200,04071
6492,8361

E a classificação como um número sort -n me dá isso:

1234,31
200,04071
6492,8361
100,00869184

Como posso usar a classificação para alcançar o resultado desejado?

Editado para adicionar: Isto é para uma operação única para criar uma lista ordenada de cerca de 7 milhões de linhas, para que soluções alternativas ou outros métodos não ortodoxos sejam perfeitamente aceitáveis.

    
por dpatchery 27.08.2012 / 17:38

4 respostas

9

Esta é certamente uma solução suja, mas eu descobri uma maneira de fazer isso graças à dica do @hckh sobre locais. Se surgir uma resposta melhor, que seria mais útil para os outros, eu certamente a aceitarei, já que isso funciona apenas para o meu problema específico.

Defini a localidade como espanhola (boliviana) para que as vírgulas fossem tratadas como pontos decimais e, em seguida, a classificação numérica padrão funcionasse.

$ export LC_NUMERIC="es_BO.utf8"

$ cat test.csv
100,00869184
6492,8361
1234,31
200,04071

$ sort -n test.csv
100,00869184
200,04071
1234,31
6492,8361
    
por 27.08.2012 / 18:32
6

O sort do GNU faz isso por padrão:

$ cat test
100,00869184
6492,8361
1234,31
200,04071

$ gsort -nt',' < test
100,00869184
200,04071
1234,31
6492,8361

Versão:

$ gsort --version
sort (GNU coreutils) 8.19

Há uma ressalva: Se a sua classificação não funcionar como esperado, então o seu -normal-order_0021 "> locale está provavelmente configurado para algo diferente do que C . Por que é isso? locale define a classificação e interpretação de letras, números, caracteres decimais, etc.

Para verificar isso, basta digitar locale em um terminal. LC_NUMERIC está definido como en_US.UTF-8 , talvez? Isso explicaria a ordem de classificação errada. Configure de volta para C :

export LC_NUMERIC=C

Em seguida, tente seu comando sort novamente. Se você quiser definir seu global locale para C , faça isso com:

export LC_ALL=C
    
por 27.08.2012 / 17:55
1

Tente adicionar a opção -g , que deve executar a classificação numérica.

Tente:

sort -t',' -g <whatever>
    
por 27.08.2012 / 17:48
0

Substitua o delimitador:

cat commafile | tr , " " | sort -n 

- deve ajudá-lo.

    
por 28.08.2012 / 00:03