मैं Red Hat Linux पर मानक टूल का उपयोग करके किसी फ़ाइल में लाइनों को कैसे यादृच्छिक कर सकता हूँ?
मेरे पास shufकमांड नहीं है , इसलिए मैं एक perlया awkएक-लाइनर की तरह कुछ ढूंढ रहा हूं जो समान कार्य को पूरा करता है।
मैं Red Hat Linux पर मानक टूल का उपयोग करके किसी फ़ाइल में लाइनों को कैसे यादृच्छिक कर सकता हूँ?
मेरे पास shufकमांड नहीं है , इसलिए मैं एक perlया awkएक-लाइनर की तरह कुछ ढूंढ रहा हूं जो समान कार्य को पूरा करता है।
जवाबों:
और एक पर्ल एक लाइनर आपको मिलता है!
perl -MList::Util -e 'print List::Util::shuffle <>'
यह एक मॉड्यूल का उपयोग करता है, लेकिन मॉड्यूल पर्ल कोड वितरण का हिस्सा है। यदि यह पर्याप्त अच्छा नहीं है, तो आप अपना स्वयं का रोल करने पर विचार कर सकते हैं।
मैंने -iध्वज ("एड-इन-प्लेस") के साथ इसका उपयोग करने की कोशिश की, ताकि यह फ़ाइल को संपादित कर सके। प्रलेखन का सुझाव है कि यह काम करना चाहिए, लेकिन यह नहीं है। यह अभी भी stfout में फेरबदल फ़ाइल प्रदर्शित करता है, लेकिन इस बार यह मूल को हटा देता है। मेरा सुझाव है कि आप इसका उपयोग न करें।
एक शेल स्क्रिप्ट पर विचार करें:
#!/bin/sh
if [[ $# -eq 0 ]]
then
echo "Usage: $0 [file ...]"
exit 1
fi
for i in "$@"
do
perl -MList::Util -e 'print List::Util::shuffle <>' $i > $i.new
if [[ `wc -c $i` -eq `wc -c $i.new` ]]
then
mv $i.new $i
else
echo "Error for file $i!"
fi
done
निष्कलंक, लेकिन उम्मीद है कि काम करता है।
ruby -e 'puts STDIN.readlines.shuffle':। यह देखने के लिए बड़े इनपुट पर परीक्षण की आवश्यकता होगी कि क्या गति तुलनीय है। (OS X पर भी काम करता है)
shufसब कुछ स्मृति में लोड करता है, इसलिए यह वास्तव में बहुत बड़ी फ़ाइल के साथ काम नहीं करता है (मेरा ~ 300GB tsv है)। यह पर्ल स्क्रिप्ट मेरी भी असफल रही, लेकिन कोई त्रुटि के अलावा Killed। किसी भी विचार अगर perl समाधान सब कुछ स्मृति में भी लोड हो रहा है, या वहाँ कुछ और समस्या है जिसका मैं सामना कर रहा हूँ?
उम, भूलने नहीं देता
sort --random-sort
brew install coreutilsसभी बर्तनों को एजी के साथ उपसर्ग किया जाता है: gsort --random-sortया gshufअपेक्षित रूप से काम करेगा
gsortऔर gshufजब मैंने किया था तब स्थापित किया थाport install coreutils
shufइसके बजाय (linux पर) का उपयोग करने पर विचार करें ।
shuf सबसे अच्छा तरीका है।
sort -Rदर्द धीमा है। मैंने अभी 5GB फ़ाइल को सॉर्ट करने की कोशिश की है। मैंने 2.5 घंटे के बाद त्याग दिया। फिर shufएक मिनट में हल कर दिया।
sort -Rधीमा है जो प्रत्येक पंक्ति के लिए एक हैश की गणना करता है। डॉक्स से: " इनपुट कुंजियों को हैशिंग से सॉर्ट करें और फिर हैश वैल्यू को सॉर्ट करें। "
shufसब कुछ स्मृति में लोड करता है।
seq -f 'line %.0f' 1000000ही, लंबे समय से संसाधित करने के लिए (बहुत अधिक, अब की तुलना में shuf), चाहे मुझे कितनी भी स्मृति आवंटित की गई हो।
cat yourfile.txt | while IFS= read -r f; do printf "%05d %s\n" "$RANDOM" "$f"; done | sort -n | cut -c7-
फ़ाइल पढ़ें, एक यादृच्छिक संख्या के साथ हर पंक्ति को प्रीपेन्ड करें, उन यादृच्छिक उपसर्गों पर फ़ाइल को सॉर्ट करें, बाद में उपसर्गों को काटें। वन-लाइनर जो किसी भी अर्ध-आधुनिक शेल में काम करना चाहिए।
EDIT: रिचर्ड हैनसेन की टिप्पणियों को शामिल किया गया।
$RANDOMडेटा को छोड़कर ), लेकिन डेटा को ब्रीच करने के लिए -1। के while read fसाथ प्रतिस्थापित करने से अग्रणी और अनुगामी व्हाट्सएप ( इस उत्तर को देखें ) को हटाने से while IFS= read -r fरोका readजा सकेगा और बैकस्लैश के प्रसंस्करण को रोका जा सकेगा । एक निश्चित-लंबाई वाले यादृच्छिक स्ट्रिंग का उपयोग करने से प्रमुख व्हाट्सएप को हटाने से रोका जा सकेगा । परिणाम: cutcat yourfile.txt | while IFS= read -r f; do printf "%05d %s\n" "$RANDOM" "$f"; done | sort -n | cut -c7-
अजगर के लिए एक लाइनर:
python -c "import random, sys; lines = open(sys.argv[1]).readlines(); random.shuffle(lines); print ''.join(lines)," myFile
और मुद्रण के लिए सिर्फ एक यादृच्छिक लाइन:
python -c "import random, sys; print random.choice(open(sys.argv[1]).readlines())," myFile
लेकिन इस पोस्ट को अजगर की कमियों के लिए देखें random.shuffle()। यह कई (2080 से अधिक) तत्वों के साथ अच्छी तरह से काम नहीं करेगा।
जिम के जवाब से संबंधित:
मेरे ~/.bashrcनिम्नलिखित शामिल हैं:
unsort ()
{
LC_ALL=C sort -R "$@"
}
जीएनयू कोरुटिल्स के प्रकार के साथ, -R= --random-sort, जो प्रत्येक पंक्ति का एक यादृच्छिक हैश उत्पन्न करता है और इसके द्वारा क्रमबद्ध होता है। रैंडमाइज्ड हैश वास्तव में कुछ पुराने (छोटी गाड़ी) संस्करणों में उपयोग नहीं किया जाएगा, जिससे यह सामान्य सॉर्ट किए गए आउटपुट को वापस कर देगा, यही कारण है कि मैंने सेट किया LC_ALL=C।
क्रिस के जवाब से संबंधित:
perl -MList::Util=shuffle -e'print shuffle<>'
एक छोटे से एक लाइनर है। (के -Mmodule=a,b,cलिए आशुलिपि है -e 'use module qw(a b c);')
कारण यह है कि यह एक सरल -iजगह में फेरबदल के लिए काम नहीं करता है क्योंकि पर्ल को उम्मीद है कि printएक ही लूप में फ़ाइल को पढ़ा जा रहा है, और print shuffle <>तब तक आउटपुट नहीं होता है जब तक कि सभी इनपुट फ़ाइलों को पढ़ा और बंद नहीं किया जाता है।
एक छोटे वर्कअराउंड के रूप में,
perl -MList::Util=shuffle -i -ne'BEGIN{undef$/}print shuffle split/^/m'
फ़ाइलों को जगह में फेरबदल करेगा। ( -nइसका अर्थ है "कोड को एक while (<>) {...}लूप में लपेटें ; BEGIN{undef$/}पर्ल लाइनों-ए-टाइम के बजाय फाइलों पर कम से कम समय पर काम करता है, और split/^/mइसकी आवश्यकता है क्योंकि $_=<>लाइनों के बजाय पूरी फाइल के साथ निहित किया गया है।"
FreeBSD की अपनी यादृच्छिक उपयोगिता है:
cat $file | random | ...
यह in / usr / games / random है, इसलिए यदि आपने गेम इंस्टॉल नहीं किया है, तो आप भाग्य से बाहर हैं।
आप textproc / rand या textproc / msort जैसे पोर्ट स्थापित करने पर विचार कर सकते हैं। यदि पोर्टेबिलिटी एक चिंता का विषय है, तो ये लिनक्स और / या मैक ओएस एक्स पर उपलब्ध हो सकते हैं।
OSX पर, http://ftp.gnu.org/gnu/coreutils/ से नवीनतम और कुछ पसंद है
./configure मेक सुडो मेक इनस्टॉल
... आपको / usr / स्थानीय / बिन / छाँटना --rrandom- तरह देना चाहिए
बिना मेस / usr / बिन / सॉर्ट के
या इसे MacPorts से प्राप्त करें:
$ sudo port install coreutils
और / या
$ /opt/local//libexec/gnubin/sort --random-sort