190 votes

Comment trier un tableau dans BASH

J'ai un tableau dans Bash, par exemple

 array=(a c b f 3 5)
 

Je dois trier le tableau. Non seulement afficher le contenu de manière triée, mais aussi obtenir un nouveau tableau avec les éléments triés. Le nouveau tableau trié peut être un tout nouveau ou l'ancien.

301voto

antak Points 2202

Vous n'avez pas vraiment besoin de tout ce code:

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

Prend en charge les espaces dans les éléments (tant que ce n'est pas une nouvelle ligne) et fonctionne dans Bash 3.x.

par exemple:

 $ array=("a c" b f "3 5")
$ IFS=$'\n' sorted=($(sort <<<"${array[*]}"))
$ printf "[%s]\n" "${sorted[@]}"
[3 5]
[a c]
[b]
[f]
 

47voto

sehe Points 123151

Origine de la réponse:

array=(a c b "f f" 3 5)
readarray -t sorted < <(for a in "${array[@]}"; do echo "$a"; done | sort)

sortie:

$ for a in "${sorted[@]}"; do echo "$a"; done
3
5
a
b
c
f f

Remarque cette version fonctionne avec des valeurs qui contient des caractères spéciaux ou des espaces (à l'exception des retours à la ligne)

Note readarray est pris en charge dans bash 4+.


Edit Basée sur la suggestion de @Dimitre j'avais mis à jour à:

readarray -t sorted < <(printf '%s\0' "${array[@]}" | sort -z | xargs -0n1)

qui a l'avantage de comprendre même le tri des éléments avec des caractères de saut de ligne intégré correctement. Malheureusement, comme correctement signalé par @ruakh cela ne signifie pas que le résultat de readarray serait correct, car readarray n'a pas d'option pour utiliser NUL au lieu de régulièrement des retours à la ligne comme des séparateurs.

40voto

Dimitre Radoulov Points 9185

Si vous n'avez pas besoin de gérer des caractères de shell spéciaux dans les éléments du tableau:

 array=(a c b f 3 5)
sorted=($(printf '%s\n' "${array[@]}"|sort))
 

Avec bash, vous aurez quand même besoin d’un programme de tri externe.

Avec zsh, aucun programme externe n'est nécessaire et les caractères spéciaux du shell sont facilement gérés:

 % array=('a a' c b f 3 5); printf '%s\n' "${(o)array[@]}" 
3
5
a a
b
c
f
 

ksh a set -s pour trier ASCIIbétiquement .

8voto

Andreas Spindler Points 1612

Dans les 3 heures de voyage en train entre Munich et Francfort (que j'ai eu de la difficulté à atteindre à cause de l'Oktoberfest commence demain), je pensais à mon premier post. Employant un tableau global est une bien meilleure idée pour une fonction de tri. La fonction suivante poignées arbitraire des chaînes de caractères (les retours à la ligne, flans...):

declare BSORT=()
function bubble_sort()
{   #
    # @param [ARGUMENTS]...
    #
    # Sort all positional arguments and store them in global array BSORT.
    # Without arguments sort this array. Return the number of iterations made.
    #
    # Bubble sorting lets the heaviest element sink to the bottom.
    #
    (($# > 0)) && BSORT=("$@")
    local j=0 ubound=$((${#BSORT[*]} - 1))
    while ((ubound > 0))
    do
        local i=0
        while ((i < ubound))
        do
            if [ "${BSORT[$i]}" \> "${BSORT[$((i + 1))]}" ]
            then
                local t="${BSORT[$i]}"
                BSORT[$i]="${BSORT[$((i + 1))]}"
                BSORT[$((i + 1))]="$t"
            fi
            ((++i))
        done
        ((++j))
        ((--ubound))
    done
    echo $j
}

bubble_sort a c b 'z y' 3 5
echo ${BSORT[@]}

Cette affiche:

3 5 a b c z y

Le même résultat est créé à partir de

BSORT=(a c b 'z y' 3 5) 
bubble_sort
echo ${BSORT[@]}

Notez que, probablement, Bash utilise en interne smart-pointeurs, le swap de l'opération pourrait être bon marché (bien que j'en doute). Toutefois, bubble_sort démontre que des fonctionnalités plus avancées comme merge_sort sont également dans la portée de la coquille de la langue.

2voto

rsingh Points 39

essaye ça:

 echo ${array[@]} | awk 'BEGIN{RS=" ";} {print $1}' | sort
 

La sortie sera:

3
5
une
b
c
F

Problème résolu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X