¿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?

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

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

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

7

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

sort -n -k 1,1 File.txt


1

Debes hacer el siguiente comando:

sort -n -k1 filename

Deberias hacer eso :)


-1

Utilice sort -nr para clasificar en orden descendente. Referir

Ordenar

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


-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

1
¿Le importaría agregar un poco de explicación de texto sobre lo que hace este código?
Stedy
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.