2010-10-29 33 views
5

我希望隨機隨機地打亂行(行),然後打印到不同的五個文件。在BASH shell中使用awk生成隨機數

但我一直保持與file1到file5中出現的線條完全相同的順序。隨機生成過程無法正常工作。我會很感激任何意見。

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

輸入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 

回答

15

如果不提供種子srand,它會使用當前的日期和時間。這意味着,如果你的進程運行得足夠快,他們將使用相同的種子並生成相同的序列。

您可以通過使用由shell提供的不同種子來解決此問題。

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

通過在每次迭代$RANDOM變化所提供的號碼,以便awk程序的每次運行得到一個不同的種子。

您可以在下面的成績單看到這個動作:

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的僞隨機還不是很隨機的,你需要不斷播種,你應該能夠使用微秒大多數情況下, ,否則你可能會想看看Bash ${RANDOM}或打/dev/urandom直接:

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