2011-01-31 23 views
67

Ejemplo: contenido de Archivo.txt:
Linux comando: ORDENAR, de acuerdo con valor numérico del campo

100 foo 
    2 bar 
    300 tuu 

Al utilizar 'Ordenar -k 1,1 archivo.txt', el orden de las líneas se no ha cambiado, aunque estamos esperando:

2 bar 
    100 foo 
    300 tuu 

¿Cómo podemos ordenar un campo de números que consiste en base a la absoluta valor numérico?

Respuesta

93

es una oportunidad única el man page for sort ...

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

Así que aquí es un ejemplo ...

sort -n filename 
+1

Gracias a todos, amigos! Esto está cableado, porque revisé varias veces su página man y no vi esa opción. Ah, estaba en una página de hombre simplificada. ¡Maldita sea! – lukmac

+1

A veces la página de manual es difícil de excavar ... – Stephan

2

Utilice sort -n o sort --numeric-sort.

6

usted tiene que utilizar la opción de clasificación numérica:

sort -n -k 1,1 File.txt 
13

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

sort -n 

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

archivos 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 se ordenan por valores numéricos.

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

P.S .: Usando sort -g rendimientos sólo los mismos resultados para este ejemplo

Editar:

Parece que la configuración regional afectan al modo en el signo menos afecta al orden (see here). Con el fin de obtener resultados adecuados que acabo de hacer:

LC_ALL=C sort -n filename.txt 
+0

+1 para la advertencia y la edición. –

-3
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 
+0

funciona realmente – karthik

+1

¿Desea agregar un poco de explicación de texto acerca de lo que hace este código? – Stedy

-1

Uso especie -nr para clasificar en orden descendente. Se refieren

Sort

la página se refieren al hombre por encima de la referencia adicional

48

responsabilidad: Sé que esta pregunta fue respondida hace mucho tiempo, pero tal vez esto sea útil a algún visitante de la cuestión.

si está ordenando las cadenas de texto que se mezclan & números, por ejemplo, los nombres de archivo de los registros de rodar a continuación selectoras con sort -n no 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 caso de que la opción -V hace el truco:

$ 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 

de página del manual:

-V, --version-sort 
      natural sort of (version) numbers within text 
+0

Esto me hizo tropezar, ¡así que gracias! La otra cosa que me fastidió, al menos en mi cygwin, es que incluso al conectar los 'ls' a través de las sustituciones' sed' para eliminar las letras y dejar solo números, aparentemente la salida de color también estaba afectando las cosas. Así que ejecutar 'ls --color = never' también marcó la diferencia. –

1

Debe hacer el siguiente comando:

sort -n -k1 filename

Eso debería hacerlo :)

Cuestiones relacionadas