readarray -t array < <(
for str in "${array[@]}"; do
printf '%d\t%s\n' "${#str}" "$str"
done | sort -k 1,1nr -k 2 | cut -f 2- )
Cela lit les valeurs du tableau trié à partir d'une substitution de processus.
La substitution de processus contient une boucle. La boucle affiche chaque élément du tableau précédé de la longueur de l'élément et d'un caractère de tabulation entre les deux.
La sortie de la boucle est triée numériquement du plus grand au plus petit (et par ordre alphabétique si les longueurs sont les mêmes, l' utilisation -k 2r
à la place de -k 2
renverser l'ordre alphabétique) et le résultat de c'est envoyé à qui supprime la colonne avec les longueurs de chaîne.cut
Tri du script de test suivi d'une exécution de test:
array=(
"tiny string"
"the longest string in the list"
"middle string"
"medium string"
"also a medium string"
"short string"
)
readarray -t array < <(
for str in "${array[@]}"; do
printf '%d\t%s\n' "${#str}" "$str"
done | sort -k 1,1nr -k 2 | cut -f 2- )
printf '%s\n' "${array[@]}"
$ bash script.sh
the longest string in the list
also a medium string
medium string
middle string
short string
tiny string
Cela suppose que les chaînes ne contiennent pas de sauts de ligne. Sur les systèmes GNU avec un récent bash
, vous pouvez prendre en charge les sauts de ligne intégrés dans les données en utilisant le caractère nul comme séparateur d'enregistrement au lieu du saut de ligne:
readarray -d '' -t array < <(
for str in "${array[@]}"; do
printf '%d\t%s\0' "${#str}" "$str"
done | sort -z -k 1,1nr -k 2 | cut -z -f 2- )
Ici, les données sont imprimées avec la fin \0
de la boucle au lieu des sauts de ligne, sort
et cut
lit les lignes délimitées par le biais de leurs -z
options GNU et readarray
lit finalement les données délimitées par -d ''
.