Tri sur une ligne identique

Bonjour, j’essaie de sortinger un ensemble d’arguments en ligne de commande numérique, puis de les répéter en ordre numérique inverse sur la même ligne avec un espace entre chaque. J’ai cette boucle:

for var in "$@" do echo -n "$var " done | sort -rn 

Cependant, lorsque j’ai ajouté l’ -n à l’écho, la commande de sort cesse de fonctionner. J’essaie de faire cela sans utiliser printf . En utilisant l’ echo -n ils ne sortingent pas et impriment simplement dans l’ordre dans lequel ils ont été entrés.

Vous pouvez le faire comme ceci:

 a=( $@ ) b=( $(printf "%s\n" ${a[@]} | sort -rn) ) printf "%s\n" ${b[@]} # b is reverse sorted nuemrically now 

sort est utilisé pour sortinger plusieurs lignes de texte. En utilisant l’option -n of echo , vous imprimez tout en une seule ligne. Si vous souhaitez que la sortie soit sortingée, vous devez l’imprimer sur plusieurs lignes:

 for var in "$@" do echo $var done | sort -rn 

Si vous voulez le résultat sur une seule ligne, vous pouvez faire:

 echo $(for var in "$@"; do echo $var; done | sort -rn) 

man sort vous dirait:

  sort - sort lines of text files 

Vous pouvez donc transformer le résultat dans le format souhaité après le sorting.

Pour atteindre le résultat souhaité, vous pouvez dire:

 for var in "$@" do echo "$var" done | sort -rn | paste -sd' ' 

Peut-être que c’est parce que le sorting est “orienté ligne”, vous avez donc besoin de chaque nombre sur une ligne séparée, ce qui n’est pas le cas en utilisant -n avec echo. Vous pouvez simplement replacer les nombres sortingés sur une seule ligne en utilisant sed, comme ceci:

 for var in "$@"; do echo "$var "; done | sort -rn | sed -e ':a;N;s/\n/ /;ba' 

Une astuce consiste à jouer avec l’IFS:

 IFS=$'\n' set "$*" IFS=$' \n' set $(sort -rn <<< "$*") echo $* 

C'est la même idée mais plus facile à lire avec la fonction join ():

 join() { IFS=$1 shift echo "$*" } join ' ' $(join $'\n' $* | sort -nr)