Como classificar um arquivo com base em seus valores numéricos para um campo?

114

Exemplo file.txt:

  100 foo
  2 bar
  300 tuu

Ao usar sort -k 1,1 file.txt, a ordem das linhas não mudará, embora estejamos esperando:

  2 bar
  100 foo
  300 tuu

Como classificar um campo que consiste em números com base no valor numérico absoluto?

Lukmac
fonte

Respostas:

149

Dê uma olhada na página do manual para classificar ...

   -n, --numeric-sort
          compare according to string numerical value

Então aqui está um exemplo ...

sort -n filename
Andrew White
fonte
1
Obrigado a todos pessoal! Isso está conectado, porque eu olhei sua página de manual várias vezes e não vi essa opção. Ah, eu estava em uma página de manual simplificada. Droga!
lukmac
1
Observe que, para pontos flutuantes, o uso -g, --general-numeric-sortpode ser mais aconselhável. Isso permite ainda mais a notação científica, por exemplo, 1.234E10 etc.
Herpes Free Engineer
103

Se você estiver classificando strings que são textos e números misturados, por exemplo, nomes de arquivos de registros contínuos, a classificação com sort -nnão funciona como esperado:

$ ls |sort -n
output.log.1
output.log.10
output.log.11
output.log.12
output.log.13
output.log.14
output.log.15
output.log.16
output.log.17
output.log.18
output.log.19
output.log.2
output.log.20
output.log.3
output.log.4
output.log.5
output.log.6
output.log.7
output.log.8
output.log.9

Nesse caso, a opção -Vresolve:

$ ls |sort -V
output.log.1
output.log.2
output.log.3
output.log.4
output.log.5
output.log.6
output.log.7
output.log.8
output.log.9
output.log.10
output.log.11
output.log.12
output.log.13
output.log.14
output.log.15
output.log.16
output.log.17
output.log.18
output.log.19
output.log.20

da página de manual:

   -V, --version-sort
          natural sort of (version) numbers within text
TMG
fonte
1
Isso me fez tropeçar, então, obrigado! A outra coisa que me confuso, pelo menos no meu cygwin, é que mesmo quando canalizando a lsatravés sedsubstituições para remover as letras e deixar apenas números, aparentemente, a saída de cor estava afetando as coisas bem. Portanto, correr ls --color=nevertambém fez diferença.
Max Starkenburg
Incrível, -Vé exatamente o que eu estava procurando. Eu deveria criar o hábito de olhar primeiro as páginas do manual.
srowley
18

Bem, a maioria das outras respostas aqui se referem a

sort -n

No entanto, não tenho certeza se isso funciona para números negativos. Aqui estão os resultados que obtenho com o sort versão 6.10 no Fedora 9.

Arquivo de entrada:

-0.907928466796875
-0.61614990234375
1.135406494140625
0.48614501953125
-0.4140167236328125

Resultado:

-0.4140167236328125
0.48614501953125
-0.61614990234375
-0.907928466796875
1.135406494140625

Que obviamente não é ordenado por valor numérico.

Então, eu acho que uma resposta mais precisa seria usar, sort -nmas somente se todos os valores forem positivos.

PS: Usar sort -gretorna os mesmos resultados para este exemplo

Editar:

Parece que as configurações de localidade afetam como o sinal de menos afeta a ordem ( veja aqui ). Para obter os resultados adequados, acabei de fazer:

LC_ALL=C sort -n filename.txt
pgilmon
fonte
7

Você deve usar a opção de classificação numérica:

sort -n -k 1,1 File.txt
Kai Sternad
fonte
3

Use sort -nou sort --numeric-sort.

Roman Cheplyaka
fonte
1

Você deve fazer o seguinte comando:

sort -n -k1 filename

Isso deve resolver :)

amc
fonte
-1

Use sort -nr para classificar em ordem decrescente. Referir

Ordenar

Consulte a página de manual acima para referências adicionais

Aarish Ramesh
fonte
-4
    echo " Enter any values to sorting: "
read n
i=0;
t=0;
echo " Enter the n value: "
for(( i=0;i<n;i++ ))
do
read s[$i]
done
for(( i=0;i<n;i++ ))
do
for(( j=i+1;j<n;j++ ))
do
if [ ${s[$i]} -gt ${s[$j]} ]
then
t=${s[$i]}
s[$i]=${s[$j]}
s[$j]=$t
fi
done
done
for(( i=0;i<n;i++ ))
do
echo " ${s[$i]}  "
done
Karthik
fonte
1
Importa-se de adicionar um pouco de explicação em texto sobre o que esse código faz?
Stedy