Classificando numericamente em um arquivo delimitado por vírgulas com o Unix

8

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

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

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

Resultado desejado:

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

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

Ambos sort -t',' -ne sort -t',' -nk1'me dê o seguinte:

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

A classificação por padrão (sem parâmetros) ou usando sort -t','me fornece o seguinte:

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

E classificar como um número sort -nme dá o seguinte:

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

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

Editado para adicionar: trata-se de uma operação única criar uma lista classificada de cerca de 7 milhões de linhas, portanto, soluções alternativas ou outros métodos não-ortodoxos são perfeitamente aceitáveis.

dpatchery
fonte
os exemplos que eu vejo aqui parecem mostrar a -topção como tendo um espaço entre o -teo personagem
SeanC
Primeiro pensamento - use corte. Ele seleciona apenas uma coluna específica, com base em um determinado separador. Também a resposta de "Artem Ice" com tr. Eu amo tr. Estou com preguiça de escrever e testar isso, no entanto. Felicidades!
Vorac 04/09/12
Possível mesmo para o caractere de tabulação: stackoverflow.com/questions/1037365/…
Ciro Santilli ()

Respostas:

9

Esta é certamente uma solução suja, mas descobri uma maneira de fazer isso graças à dica do @ slhck sobre localidades. Se surgir uma resposta melhor que seja mais útil para outras pessoas, certamente a aceitarei, pois isso funciona apenas para o meu problema específico.

Defino o código do idioma como espanhol (boliviano) para que as vírgulas sejam tratadas como pontos decimais e, em seguida, a classificação numérica padrão fará o truque.

$ 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
dpatchery
fonte
Ah, veja, eu teria sugerido o uso de uma localidade alemã ou similar. Não consigo pensar em mais nada no momento sem poder testá-lo ou quais ferramentas você tem disponível, já que esta é uma versão rara do Unix.
slhck
@slhck Esse parece ser o ponto crucial da maioria dos problemas que eu fico presa no UNIX :) Obrigado pela ajuda em me levar a uma solução, independentemente.
Dpatchery
6

GNU's sortfaz 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

No entanto, há uma ressalva: se sua classificação não funcionar como esperado, localeé provável que você esteja definido como algo diferente de C. Por que é isso? localedefine classificação e interpretação de letras, números, caracteres decimais etc.

Para verificar isso, basta entrar localeem um terminal. Está LC_NUMERICdefinido como en_US.UTF-8, talvez? Isso explicaria a ordem de classificação errada. Defina de volta para C:

export LC_NUMERIC=C

Em seguida, tente seu sortcomando novamente. Se você deseja definir o seu mundial localepara C, fazer isso com:

export LC_ALL=C
slhck
fonte
Não tenho acesso ao GNU no meu ambiente. É algo que eu poderia facilmente remover e remover quando terminar? HMU no chat, se alguém quiser me ajudar a fazer isso ... Eu sou o novato do UNIX.
Dpatchery
Tenho certeza de que é apenas um localeproblema. Mas o que é sort --versionpara você, na verdade?
slhck
sort --version me dá um argumento ilegal. --comandos também não funcionaram para mim no passado. Verifiquei a página de manual e não há nenhuma versão explicitamente mencionada, mas ela lista "HP-UX 11i Versão 2: agosto de 2003", se isso ajuda. Meu LC_NUMERIC está definido como "C".
Dpatchery
A localidade alemã, por exemplo, seria usada ,como um separador decimal. Eu nunca usei o HP-UX.
slhck
1

Tente adicionar a -gopção que deve executar a classificação numérica.

Tentar:

sort -t',' -g <whatever>
HeatfanJohn
fonte
A -nclassificação numérica não é ? -g me dá uma opção ilegal.
Dpatchery
-gé a general-numeric-sortopção e deve estar disponível em qualquer versão recente do sort. @dpatchery
slhck
Este é o meu local de trabalho para que eu quase definitivamente não tem uma versão recente :)
dpatchery
0

Substitua o delimitador:

cat commafile | tr , " " | sort -n 

- deveria ajudá-lo.

defhlt
fonte