webentwicklung-frage-antwort-db.com.de

zufällig mischen von Dateien in Bash

Ich habe einige Dateien in Linux. Zum Beispiel 2 und ich muss die Dateien in einer Datei mischen.

Zum Beispiel

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

und 

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

Und später, wenn ich die beiden Dateien mische, kann ich etwas bekommen:

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

Sie sollten shuf command =) verwenden.

cat file1 file2 | shuf

Oder mit Perl:

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

Sortieren:

cat file1 file2 | sort -R

Shuf:

cat file1 file2 | shuf

Perl:

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

BASH:

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

Nur ein Hinweis an OS X-Benutzer, die MacPorts verwenden: Der Befehl shuf ist Teil von coreutils und wird unter dem Namen gshuf installiert.

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

Hier ist ein One-Liner, der nicht auf shuf oder sort -R angewiesen ist, die ich nicht auf meinem Mac hatte:

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

Dadurch werden alle Zeilen in my_file durchlaufen und in zufälliger Reihenfolge erneut gedruckt.

10
Tyler

Ich würde auch shuf verwenden. 

eine andere Option hat gnu sort:

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

du könntest es versuchen:

cat file1 file2|sort -R
6
Kent

Sie müssen hier keine Pfeifen verwenden. Sort sort alleine macht dies mit den Dateien als Parametern. Ich würde es einfach tun

sort -R file1

oder wenn Sie mehrere Dateien haben

sort -R file1 file2
6
davvs

Das hat bei mir funktioniert. Es verwendet den Fisher-Yates-Shuffle.

randomize()
{   
    arguments=("[email protected]")
    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

Es ist eindeutig voreingenommener Rand (wie die Hälfte der Zeit beginnt die Liste mit der ersten Zeile), aber für einige grundlegende Randomisierung mit nur bash builtins denke ich, dass es in Ordnung ist? Drucken Sie einfach jede Zeile mit Ja/Nein und dann den Rest ...

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