2010-10-29 10 views
5

में अजीब के साथ यादृच्छिक संख्या पीढ़ी मैं यादृच्छिक रूप से एक फ़ाइल की पंक्तियों (पंक्तियों) को घुमाने के लिए अलग-अलग पांच फाइलों में प्रिंट करना चाहता हूं।BASH shell

लेकिन मैं फाइल 1 में फ़ाइल 1 में दिखाई देने वाली रेखाओं का बिल्कुल वही क्रम रखता हूं। यादृच्छिक पीढ़ी की प्रक्रिया ठीक से काम नहीं करती है। मैं किसी भी सलाह के लिए आभारी होंगे।

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

इनपुट srand को

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

आप एक बीज प्रदान नहीं करते हैं shuffling.txt, यह वर्तमान दिनांक और समय का उपयोग करेगा। इसका मतलब है, यदि आपकी प्रक्रियाएं पर्याप्त तेज़ी से चलती हैं, तो वे सभी एक ही बीज का उपयोग करेंगे और समान अनुक्रम उत्पन्न करेंगे।

आप शैल द्वारा प्रदान किए गए एक अलग बीज का उपयोग कर इसके आसपास हो सकते हैं।

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