web-dev-qa-db-fra.com

remaniement aléatoire des fichiers dans Bash

J'ai des fichiers sous Linux. Par exemple, 2 et j'ai besoin de mélanger les fichiers dans un fichier.

Par exemple

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

et 

$cat file2
linea one
linea two
linea three
linea four
linea five
linea six
linea seven
linea eight

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

linea eight
line 4
linea five
line 1
linea three
line 8
linea seven
line 5
linea two
linea one
line 2
linea four
line 7
linea six
line 1
line 6
37
Code Geas Coder

Vous devriez utiliser shuf command =)

cat file1 file2 | shuf

Ou avec Perl:

cat file1 file2 | Perl -MList::Util=shuffle -wne 'print shuffle <>;'
70
Gilles Quenot

Trier:

cat file1 file2 | sort -R

Shuf:

cat file1 file2 | shuf

Perl:

cat file1 file2 | Perl -MList::Util=shuffle -e 'print shuffle<STDIN>'

FRAPPER:

cat file1 file2 | while IFS= read -r line
do
    printf "%06d %s\n" $RANDOM "$line"
done | sort -n | cut -c8-

Awk:

cat file1 file2 | awk 'BEGIN{srand()}{printf "%06d %s\n", Rand()*1000000, $0;}' | sort -n | cut -c8-
34
jm666

Juste une note pour les utilisateurs de Mac OS X: la commande shuf fait partie de coreutils et est installée sous le nom gshuf.

$ Sudo port install coreutils
$ gshuf example.txt # or cat example.txt | gshuf
19
Messa

Voici une ligne qui ne repose pas sur shuf ou sort -R, que je n'avais pas sur mon mac:

while read line; do echo $RANDOM $line; done < my_file | sort -n | cut -f2- -d' '

Cela parcourt toutes les lignes dans my_file et les réimprime dans un ordre aléatoire.

10
Tyler

J'utiliserais aussi shuf

une autre option, sorte de gnou a:

   -R, --random-sort
          sort by random hash of keys

tu pourrais essayer:

cat file1 file2|sort -R
6
Kent

Vous n'avez pas besoin d'utiliser des tuyaux ici. Tri seul fait ceci avec le (s) fichier (s) en tant que paramètres. Je voudrais juste faire

sort -R file1

ou si vous avez plusieurs fichiers

sort -R file1 file2
6
davvs

Cela a fonctionné pour moi. Il utilise le shuffle 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
}
1
mmore500

Il est clairement biaisé Rand (comme la moitié du temps, la liste commencera par la première ligne), mais pour une randomisation de base avec juste une construction bash, je suppose que ça va? Il suffit d’imprimer chaque ligne oui/non, puis d’imprimer 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"
}
0
untore