2010-04-12 4 views

Répondre

29

Voici un exemple simple pour vous aider à aller:

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

tr traduit les espaces délimitant les numéros, dans des retours chariot, car tri utilise des retours chariot comme délimiteurs (il est pour le tri lignes du texte). L'option -g indique le tri par "valeur numérique générale".

man sort pour plus de détails sur sort.

+3

J'ai ajouté un autre '' | tr' avec les paramètres inversés pour extraire une chaîne délimitée par un espace. – isuldor

+0

Pour inverser le tri, utilisez '-r'. – Tim

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

Ceci est une variation sur réponse ghostdog74 qui est trop grand pour tenir dans un commentaire. Il affiche des chiffres au lieu de noms de nombres et la chaîne d'origine et le résultat sont dans des chaînes délimitées par des espaces (au lieu d'un tableau qui devient une chaîne délimitée par une nouvelle ligne).

$ 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 vous n'avez pas utilisé le echo lors de la mise à la valeur de sorted, la chaîne a des sauts de ligne en elle. Dans ce cas, l'écho sans les guillemets met tout sur une seule ligne, mais, comme le montre l'écho avec des citations, chaque nombre apparaîtrait sur sa propre ligne. C'est le cas si l'original est un tableau ou une chaîne.

# 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

Utilisation de l'extension des paramètres Bash (pour remplacer les espaces avec des sauts de ligne) nous pouvons faire:

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 vous avez fait une chaîne délimitée par des espaces de nombres, alors l'un des autres réponses fournies fonctionnerait bien. Si votre liste est un tableau bash, alors:

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

peut être une meilleure solution. Le délimiteur de nouvelle ligne serait utile si vous voulez généraliser pour trier un tableau de chaînes au lieu de nombres.

+0

ma liste est un tableau bash, mais cela ne fonctionne pas pour moi: 'packages =" $ (sorte <<< $ {! 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

Alors que cet extrait de code peut être la solution, [y compris une explication] (// meta.stackexchange.com/questions/114762/explaining-entirely- code-based-answers) aide vraiment à améliorer la qualité de votre message.Rappelez-vous que vous répondez à la question pour les lecteurs dans le futur, et que ces personnes pourraient ne pas connaître les raisons de votre suggestion de code. – yivi

0

Améliorer sur beau "tableau sorte" Bash Evan Krall en limitant la portée de l'IFS à une seule commande:

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

Ceci est une variante de réponse @JamesMorris:

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

Au lieu de tr, j'utilise xargs -n1 pour convertir en nouvelles lignes. Le dernier xargs doit être reconverti en une suite de nombres séparés par des espaces.

Questions connexes