2010-10-29 17 views
5

Ich möchte die Zeilen (die Zeilen) einer Datei zufällig mischen und dann auf verschiedene fünf Dateien ausdrucken.Zufallszahlengenerierung mit awk in BASH-Shell

Aber ich habe genau die gleiche Reihenfolge der Zeilen in Datei1 bis Datei5 erschienen. Der Zufallserzeugungsprozess funktioniert nicht ordnungsgemäß. Ich wäre dankbar für irgendwelche Ratschläge.

#!/bin/bash 
for i in seq 1 5 
do 
    awk 'BEGIN{srand();} {print rand()"\t"$0}' shuffling.txt | sort -k2 -k1 -n | cut -f2- > file$i.txt 
done 

Eingang shuffling.txt

111 1032192 
111 2323476 
111 1698881 
111 2451712 
111 2013780 
111 888105 
112 2331004 
112 1886376 
112 1189765 
112 1877267 
112 1772972 
112 574631 

Antwort

15

Wenn Sie einen Samen zu srand nicht weiter, wird es das aktuelle Datum und die Zeit. Das heißt, wenn Ihre Prozesse schnell genug laufen, verwenden sie alle den gleichen Seed und erzeugen die gleiche Sequenz.

Sie können dies umgehen, indem Sie einen anderen Seed verwenden, der von der Shell bereitgestellt wird.

awk -v seed=$RANDOM 'BEGIN{srand(seed);}{print rand()" "$0}' ... 

Die Anzahl von $RANDOM Änderungen in jeder Iteration so vorgesehen, dass jeder Durchlauf des Programms awk erhält ein anderes Saatgut.

Sie diese in Aktion im folgende Transkript sehen:

pax> for i in $(seq 1 5) ; do 
...> awk 'BEGIN{srand();print rand()}' 
...> done 
0.0435039 
0.0435039 
0.0435039 
0.0435039 
0.0435039 

pax> for i in $(seq 1 5) ; do 
...> awk -v seed=$RANDOM 'BEGIN{srand(seed);print rand()}' 
...> done 
0.283898 
0.0895895 
0.841535 
0.249817 
0.398753 
2
#!/bin/bash 
for i in {1..5} 
do 
    shuf -o "file$i.txt" shuffling.txt 
done 
1

Awk des Pseudo-Zufall nicht sehr zufällig ist, Sie Säen halten müssen, sollten Sie in der Lage sein, Mikrosekunden für die meisten Situationen zu verwenden, , sonst können Sie in Bash ${RANDOM} aussehen wollen oder /dev/urandom direkt treffen:

awk 'BEGIN{"date +%N"|getline rseed;srand(rseed);close("date +%N");print rand()}'

for((i=1;i<=5;i++));do awk 'BEGIN{"date +%N"|getline rseed;srand(rseed);close("date +%N");print rand()}';done