2010-10-29 17 views
5

Desidero mischiare le righe (le righe) di un file in modo casuale, quindi stampare su cinque file diversi.Generazione di numeri casuali con awk nella shell BASH

Ma continuo ad avere esattamente lo stesso ordine di righe apparso in file1 su file5. Il processo di generazione casuale non funziona correttamente. Sarei grato per qualsiasi consiglio.

#!/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 

ingresso 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 

risposta

15

Se non si fornisce un seme per srand, userà la data e l'ora correnti. Ciò significa che se i tuoi processi sono eseguiti abbastanza velocemente, tutti useranno lo stesso seme e genereranno la stessa sequenza.

È possibile aggirare questo utilizzando un seme diverso, fornito dalla shell.

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

Il numero fornito da $RANDOM cambiamenti in ogni iterazione così ogni esecuzione del programma awk ottiene un seme differente.

È possibile vedere in azione nel seguente trascrizione:

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

di Awk pseudo-casuale non è molto casuale, è necessario mantenere la semina, si dovrebbe essere in grado di utilizzare microsecondi per la maggior parte delle situazioni , altrimenti si potrebbe voler guardare in Bash ${RANDOM} o colpire /dev/urandom diretta:

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 
Problemi correlati