मैं 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
जा सकेगा और बैकस्लैश के प्रसंस्करण को रोका जा सकेगा । एक निश्चित-लंबाई वाले यादृच्छिक स्ट्रिंग का उपयोग करने से प्रमुख व्हाट्सएप को हटाने से रोका जा सकेगा । परिणाम: cut
cat 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