Existe-t-il un utilitaire Linux ou une commande Bash que je peux utiliser pour trier une chaîne de nombres délimitée par des espaces?Tri des nombres délimités par des espaces avec Linux/Bash
Répondre
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
.
$ s=(one two three four)
$ sorted=$(printf "%s\n" ${s[@]}|sort)
$ echo $sorted
four one three two
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
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}}"
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.
ma liste est un tableau bash, mais cela ne fonctionne pas pour moi: 'packages =" $ (sorte <<< $ {! Package2apk [@]}) "' – Jayen
$ awk 'BEGIN{split(ARGV[1], numbers);for(i in numbers) {print numbers[i]} }' \
"6 7 4 1 2 3" | sort -n
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
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}"
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.
- 1. Fichiers plats délimités par des espaces arrière
- 2. Regex: entiers délimités par des virgules
- 3. Tri des chaînes contenant des nombres d'une manière conviviale
- 4. Problème de script de programme par lots avec des espaces avec des espaces
- 5. Récupérer des nombres séparés par '-'
- 6. Regex pour valider le nombre d'éléments délimités par des tuyaux
- 7. Comment faire défiler des jetons délimités avec une expression régulière?
- 8. Expression régulière pour remplacer les champs délimités par des virgules vides par "NA"
- 9. Regex: comment trouver un nombre entouré par des espaces?
- 10. Sortie efficace des nombres
- 11. Concaténation de nombres séparés par des espaces dans un fichier de commandes
- 12. bash: expansion des variables avec des espaces
- 13. Numériser des nombres avec jQuery?
- 14. Tri des fichiers avec DirectoryIterator
- 15. Séparer le texte par des espaces blancs
- 16. imagettftext avec des espaces irréguliers
- 17. Impression avec des espaces fixes
- 18. Xml avec des espaces comme
- 19. Wordpress - Tri des publications par date d'expiration
- 20. expression régulière: une ligne de chaîne contient uniquement des nombres flottants et des tabulations/espaces
- 21. Limites des techniques de tri par comparaison
- 22. Suppression des répertoires avec des espaces avec bash
- 23. Gridview Tri avec des images
- 24. convertir des fichiers Excel en fichiers texte délimités par des tabulations
- 25. Convertir des nombres à double octet et des espaces dans les noms de fichiers en ASCII
- 26. Tri des résultats SPARQL par date
- 27. Tri des sous-éléments XMLListCollection par flexion
- 28. Tri des données numériques par ordre alphabétique
- 29. Tri des tableaux multidimensionnels par taille d'élément
- 30. Comment lire des informations délimitées par des espaces à partir d'un fichier en C++
J'ai ajouté un autre '' | tr' avec les paramètres inversés pour extraire une chaîne délimitée par un espace. – isuldor
Pour inverser le tri, utilisez '-r'. – Tim