2010-04-12 8 views

Respuesta

29

Aquí está un ejemplo sencillo para que te va:

echo "81 4 6 12 3 0" | tr " " "\n" | sort -g

tr traduce los espacios que delimitan los números, en los retornos de carro, porque especie utiliza retornos de carro como delimitadores (es decir, es para la clasificación líneas de texto). La opción -g le dice a ordenar que ordena por "valor numérico general".

man sort para obtener más detalles acerca de sort.

+3

Agregué otro '| tr' con los parámetros invertidos para recuperar una cadena delimitada por espacios. – isuldor

+0

Para invertir el orden, use '-r'. – Tim

2
$ s=(one two three four) 
$ sorted=$(printf "%s\n" ${s[@]}|sort) 
$ echo $sorted 
four one three two 
3

Esta es una variación de respuesta de ghostdog74 que es demasiado grande para caber en un comentario. Muestra dígitos en lugar de nombres de números y tanto la cadena original como el resultado están en cadenas delimitadas por espacios (en lugar de una matriz que se convierte en una cadena delimitada por una nueva línea).

$ s="3 2 11 15 8" 
$ sorted=$(echo $(printf "%s\n" $s | sort -n)) 
$ echo $sorted 
2 3 8 11 15 
$ echo "$sorted" 
2 3 8 11 15 

Si no ha utilizado el echo cuando se ajusta el valor de sorted, la cadena tiene saltos de línea en el mismo. En ese caso, haciéndolo eco sin comillas lo pone todo en una línea, pero, como lo haría eco con comillas, cada número aparecería en su propia línea. Este es el caso si el original es una matriz o una cadena.

# demo 
$ s="3 2 11 15 8" 
$ sorted=$(printf "%s\n" $s | sort -n) 
$ echo $sorted 
2 3 8 11 15 
$ echo "$sorted" 
2 
3 
8 
11 
15 
1

Usando la expansión de parámetros Bash (para reemplazar espacios con saltos de línea) que podemos hacer:

str="3 2 11 15 8" 
sort -n <<< "${str// /$'\n'}" 

# alternative 
NL=$'\n' 
str="3 2 11 15 8" 
sort -n <<< "${str// /${NL}}" 
0

Si usted tiene realmente una cadena delimitada por espacios de los números, a continuación, una de las otras respuestas proporcionadas funcionaría multa. Si la lista es una matriz de fiesta, entonces:

oldIFS="$IFS" 
IFS=$'\n' 
array=($(sort -g <<< "${array[*]}")) 
IFS="$oldIFS" 

podría ser una solución mejor. El delimitador de línea nueva sería útil si desea generalizar para ordenar una matriz de cadenas en lugar de números.

+0

mi lista es una matriz bash, pero esto no funciona para mí: 'packages =" $ (sort <<< $ {! Package2apk [@]}) "' – Jayen

0
$ awk 'BEGIN{split(ARGV[1], numbers);for(i in numbers) {print numbers[i]} }' \ 
    "6 7 4 1 2 3" | sort -n 
+0

Si bien este fragmento de código puede ser la solución, [incluido una explicación] (// meta.stackexchange.com/questions/114762/explaining-entirely- code-based-answers) realmente ayuda a mejorar la calidad de su publicación.Recuerde que usted está respondiendo la pregunta a los lectores en el futuro, y es posible que esas personas no sepan los motivos de su sugerencia de código. – yivi

0

La mejora en buen golpe de Evan Krall "array tipo" al limitar el alcance de IFS a un solo comando:

printf "%q\n" "${IFS}" 
array=(3 2 11 15 8) 
array=($(IFS=$'\n' sort -n <<< "${array[*]}")) 
echo "${array[@]}" 
printf "%q\n" "${IFS}" 
3

Esta es una variación de la respuesta @JamesMorris:

echo "81 4 6 12 3 0" | xargs -n1 | sort -g | xargs 

En lugar de tr, uso xargs -n1 para convertir a líneas nuevas. El xargs final es convertir de nuevo a una secuencia de números separados por espacios.

Cuestiones relacionadas