¿Cómo ordenar un archivo, según sus valores numéricos para un campo?

114

Ejemplo file.txt:

  100 foo
  2 bar
  300 tuu

Cuando se usa sort -k 1,1 file.txt, el orden de las líneas no cambiará, aunque esperamos:

  2 bar
  100 foo
  300 tuu

¿Cómo ordenar un campo que consta de números según el valor numérico absoluto?

lukmac
fuente

Respuestas:

149

Eche un vistazo a la página de manual para ordenar ...

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

Así que aquí hay un ejemplo ...

sort -n filename
Andrew White
fuente
1
¡Gracias a todos, amigos! Esto está cableado, porque miré su página de manual de un lado a otro varias veces y no vi esa opción. Ah, estaba en una página de manual simplificada. ¡Maldición!
lukmac
1
Tenga en cuenta que, para los puntos flotantes, -g, --general-numeric-sortpodría ser más recomendable usar . Esto permite además la notación científica, por ejemplo, 1.234E10, etc.
Ingeniero libre de herpes
103

Si está ordenando cadenas que son texto y números mixtos, por ejemplo, nombres de archivo de registros continuos, la clasificación con sort -nno funciona como se esperaba:

$ 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

En ese caso, la opción -Vfunciona:

$ 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

desde la página del manual:

   -V, --version-sort
          natural sort of (version) numbers within text
TMG
fuente
1
Esto me hizo tropezar, ¡así que gracias! La otra cosa que me mal estado, por lo menos en mi cygwin, es que incluso cuando la tubería lsa través de sedsustituciones para eliminar las letras y dejar sólo números, al parecer, la salida de color estaba afectando cosas así. Así que correr ls --color=nevertambién marcó la diferencia.
Max Starkenburg
Impresionante, -Ves exactamente lo que estaba buscando. Debería tener el hábito de mirar primero las páginas del manual.
srowley
18

Bueno, la mayoría de las otras respuestas aquí se refieren a

sort -n

Sin embargo, no estoy seguro de que esto funcione con números negativos. Estos son los resultados que obtengo con sort versión 6.10 en Fedora 9.

Fichero de entrada:

-0.907928466796875
-0.61614990234375
1.135406494140625
0.48614501953125
-0.4140167236328125

Salida:

-0.4140167236328125
0.48614501953125
-0.61614990234375
-0.907928466796875
1.135406494140625

Que obviamente no está ordenado por valor numérico.

Entonces, supongo que una respuesta más precisa sería usar sort -n pero solo si todos los valores son positivos.

PD: usando sort -g devuelve los mismos resultados para este ejemplo

Editar:

Parece que la configuración regional afecta la forma en que el signo menos afecta el pedido ( consulte aquí ). Para obtener los resultados adecuados, acabo de hacer:

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

Tienes que usar la opción de ordenación numérica:

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

Utilice sort -no sort --numeric-sort.

Roman Cheplyaka
fuente
1

Debes hacer el siguiente comando:

sort -n -k1 filename

Deberias hacer eso :)

amc
fuente
-1

Utilice sort -nr para clasificar en orden descendente. Referir

Ordenar

Consulte la página de manual anterior para obtener más referencias

Aarish Ramesh
fuente
-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
fuente
1
¿Le importaría agregar un poco de explicación de texto sobre lo que hace este código?
Stedy