Eu tenho um arquivo separado por vírgula 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 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',' -n
e 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 -n
me 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.
-t
opção como tendo um espaço entre o-t
eo personagemRespostas:
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.
fonte
GNU's
sort
faz isso por padrão:Versão:
No entanto, há uma ressalva: se sua classificação não funcionar como esperado,
locale
é provável que você esteja definido como algo diferente deC
. Por que é isso?locale
define classificação e interpretação de letras, números, caracteres decimais etc.Para verificar isso, basta entrar
locale
em um terminal. EstáLC_NUMERIC
definido comoen_US.UTF-8
, talvez? Isso explicaria a ordem de classificação errada. Defina de volta paraC
:Em seguida, tente seu
sort
comando novamente. Se você deseja definir o seu mundiallocale
paraC
, fazer isso com:fonte
locale
problema. Mas o que ésort --version
para você, na verdade?--
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".,
como um separador decimal. Eu nunca usei o HP-UX.Tente adicionar a
-g
opção que deve executar a classificação numérica.Tentar:
fonte
-n
classificação numérica não é ? -g me dá uma opção ilegal.-g
é ageneral-numeric-sort
opção e deve estar disponível em qualquer versão recente dosort
. @dpatcherySubstitua o delimitador:
- deveria ajudá-lo.
fonte