101 votes

Mélange aléatoire des lignes dans Linux / Bash

J'ai quelques fichiers dans linux. Par exemple 2 et j'ai besoin de mélanger les fichiers dans un seul fichier.

Par exemple

$cat file1
line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8

et

$cat file2
ligne un
ligne deux
ligne trois
ligne quatre
ligne cinq
ligne six
ligne sept
ligne huit

Et plus tard lorsque je mélange les deux fichiers, je peux obtenir quelque chose comme:

ligne huit
ligne 4
ligne cinq
ligne 1
ligne trois
ligne 8
ligne sept
ligne 5
ligne deux
ligne un
ligne 2
ligne quatre
ligne 7
ligne six
ligne 1
ligne 6

8voto

Kent Points 71470

Je vais utiliser shuf aussi.

une autre option, gnu sort a:

   -R, --random-sort
          trier par hachage aléatoire des clés

vous pourriez essayer:

cat fichier1 fichier2|tri -R

1voto

mmore500 Points 11

Cela a fonctionné pour moi. Il utilise la mé\-thode de mélange Fisher-Yates.

randomize()
{   
    arguments=("$@")
    declare -a out
    i="$#"
    j="0"

while [[ $i -ge "0" ]] ; do
    which=$(random_range "0" "$i")
    out[j]=${arguments[$which]}
    arguments[!which]=${arguments[i]}
    (( i-- ))
    (( j++ ))
done
echo ${out[*]}
}

random_range()
{
    low=$1
    range=$(($2 - $1))
    if [[ range -ne 0 ]]; then
        echo $(($low+$RANDOM % $range))
    else
        echo "$1"
    fi
}

0voto

untore Points 163

Il est clairement biaisé rand (comme la moitié du temps la liste commencera par la première ligne) mais pour une certaine randomisation de base avec juste des builtins bash je pense que c'est bien? Imprimez juste chaque ligne oui/non puis imprimez le reste...

shuffle() {
    local IFS=$'\n' tail=
    while read l; do
        if [ $((RANDOM%2)) = 1 ]; then
            echo "$l"
        else
            tail="${tail}\n${l}"
        fi
    done < $1
    printf "${tail}\n"
}

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