2011-05-06 11 views
5

मैं एक निश्चित बीज के साथ फ़ाइल की रेखाओं को घुमाने के लिए चाहता हूं ताकि मुझे हमेशा समान यादृच्छिक क्रम प्राप्त हो।एक निश्चित बीज के साथ एक फाइल की शफल लाइनें?

sort -R file.txt | head -200 > file.sff 

क्या परिवर्तन मैं इसे कर सकता है इतना है कि यह एक निश्चित यादृच्छिक बीज के साथ सॉर्ट करता: आदेश मैं उपयोग कर रहा हूँ इस प्रकार है?

टेड

+0

'- यादृच्छिक-स्रोत 'काम नहीं करता है? – falstro

+1

बस इसे अपने आप का जवाब मिला, लेकिन हाँ यह आपके साथ है - यादृच्छिक स्रोत रो, आप के लिए kudos। – Flethuseo

+0

उत्तर इस लिंक में है: http://stackoverflow.com/questions/537191/the-sort-r-command-doesnt-sort-lines-randomly-in-linux – Flethuseo

उत्तर

-3

आप बेतरतीब ढंग से लाइनों फेरबदल कर रहे हैं, तो आप छँटाई नहीं कर रहे हैं। मैंने sort को --random-source संकेत से पहले नहीं देखा है। यह दिलचस्प होगा अगर यह अस्तित्व में है। हालांकि, यह एक निश्चित क्रम में लाइनों को सॉर्ट नहीं कर रहा है।

मुझे विश्वास है कि आपको उस पर एक प्रोग्राम लिखना होगा, और मुझे नहीं लगता कि बैश काफी कुछ कर सकता है।

वास्तव में, यह हो सकता है। $ RANDOM पर्यावरण परिवर्तक 0 से 32767 तक एक यादृच्छिक संख्या का चयन करता है। आप RANDOM पर बीज निर्दिष्ट कर सकते हैं और यादृच्छिक संख्या अनुक्रम अधिक से अधिक दिखाई देगा। आप card dealing algorithm का उपयोग कर सकते हैं। प्रत्येक पंक्ति में बैश सरणी में पढ़ें, फिर प्रत्येक पंक्ति को चुनने के लिए कार्ड से निपटने वाले एल्गोरिदम का उपयोग करें।

मैं एक परीक्षण कार्यक्रम नहीं लिखूंगा - खासकर बैश में, लेकिन आपको विचार प्राप्त करना चाहिए।

5

sort का जीएनयू कार्यान्वयन --random-source तर्क है। इस तर्क को ज्ञात सामग्री वाले फ़ाइल के नाम से पास करने के परिणामस्वरूप आउटपुट का विश्वसनीय सेट होगा।

देखें GNU coreutils के मैनुअल में Random sources प्रलेखन, जो निम्न नमूना कार्यान्वयन और उदाहरण:

get_seeded_random() 
{ 
    seed="$1" 
    openssl enc -aes-256-ctr -pass pass:"$seed" -nosalt \ 
    </dev/zero 2>/dev/null 
} 

shuf -i1-100 --random-source=<(get_seeded_random 42) 

के बाद से जीएनयू sort भी coreutils का हिस्सा है, प्रासंगिक दस्तावेज वहाँ के रूप में अच्छी तरह से लागू होता है :

sort --random-source=<(get_seeded_random 42) -R file.txt | head -200 > file.sff 
+0

चूंकि 'sort' और' shuf' दोनों हैं जीएनयू कोरुटिल्स का हिस्सा, क्या यह मामूली बात है? यदि किसी के पास एक है, तो वे दोनों होंगे। –

+0

@rici, ... उचित रूप से संपादित किया गया। –

+0

यदि मैकोज़ पर होमब्रू का उपयोग करना है, तो 'शफ'' gshuf' (कोरियल्स 'पैकेज का हिस्सा है)। – mommi84

0

आपको बाहरी उपकरण जैसे sort का उपयोग करने की आवश्यकता नहीं है, जिसका ऑप्टियो एनएस और उपयोग आपके ऑपरेटिंग सिस्टम के आधार पर भिन्न हो सकता है। बैश में $RANDOM चर के माध्यम से एक आंतरिक यादृच्छिक संख्या जेनरेटर सुलभ है।

RANDOM=$$ 

या

RANDOM=$(date '+%s') 

आदि: यह तो जैसे चर की स्थापना, द्वारा जनरेटर बीज के आम बात हैलेकिन निश्चित रूप से, आप भी एक उम्मीद के मुताबिक बीज क्रम में उम्मीद के मुताबिक नहीं-तो-यादृच्छिक परिणाम पाने के लिए उपयोग कर सकते हैं:

$ RANDOM=12345; echo $RANDOM 
28207 
$ RANDOM=12345; echo $RANDOM 
28207 

बेतरतीब ढंग से मैप किया गया फ़ाइल की तर्ज को पुन: व्यवस्थित करने के लिए, आप एक mapfile का उपयोग कर सरणी में फ़ाइल पढ़ सकते हैं :

$ mapfile -t a < source.txt 

तो बस सरणी सूचकांक पुनर्लेखन:

$ for i in ${!a[@]}; do a[$((RANDOM+${#a[@]}))]="${a[$i]}"; unset a[$i]; done 

जब एक गैर साहचर्य सरणी, सूचकांक मूल्य के आरोही क्रम में बैश स्वाभाविक रूप से आदेश तत्वों पढ़ने।

ध्यान दें कि नई प्रत्येक पंक्ति के लिए अनुक्रमणिका में उस श्रेणी के भीतर टकराव से बचने के लिए इसमें शामिल सरणी तत्वों की संख्या है। यह समाधान अभी भी असंभव है - इस बात की कोई गारंटी नहीं है कि $RANDOM अद्वितीय संख्याएं उत्पन्न करेगा। आपको लगता है कि प्रत्येक सूचकांक के पूर्व उपयोग के लिए जाँच करता है अतिरिक्त कोड के साथ कि जोखिम को कम कर सकते हैं, या थोड़ा-स्थानांतरण के साथ जोखिम को कम:

... a[$(((RANDOM<<15)+RANDOM+${#a[@]}))]= ... 

यह एक 15 बिट के बजाय एक 30 बिट अहस्ताक्षरित int में अपने सूचकांक मूल्यों बनाता है हस्ताक्षरित int।

संबंधित मुद्दे