আমি কীভাবে রেড হ্যাট লিনাক্সের স্ট্যান্ডার্ড সরঞ্জাম ব্যবহার করে কোনও ফাইলের লাইনগুলিকে এলোমেলো করতে পারি?
আমার কাছে shuf
আদেশ নেই, তাই আমি একই কাজটি সম্পাদনকারী perl
বা awk
এক-লাইনারের মতো কিছু সন্ধান করছি ।
আমি কীভাবে রেড হ্যাট লিনাক্সের স্ট্যান্ডার্ড সরঞ্জাম ব্যবহার করে কোনও ফাইলের লাইনগুলিকে এলোমেলো করতে পারি?
আমার কাছে shuf
আদেশ নেই, তাই আমি একই কাজটি সম্পাদনকারী perl
বা awk
এক-লাইনারের মতো কিছু সন্ধান করছি ।
উত্তর:
এবং একটি পার্ল এক-লাইনার আপনি পান!
perl -MList::Util -e 'print List::Util::shuffle <>'
এটি একটি মডিউল ব্যবহার করে তবে মডিউলটি পার্ল কোড বিতরণের একটি অংশ। যদি এটি যথেষ্ট ভাল না হয় তবে আপনি নিজের ঘূর্ণায়মান বিবেচনা করতে পারেন।
-i
এটি ফাইলটি সম্পাদনা করতে আমি পতাকাটির ("প্লে-এডিট-ইন-প্লেস") দিয়ে এটি ব্যবহার করার চেষ্টা করেছি । ডকুমেন্টেশনের পরামর্শ দেয় এটির কাজ করা উচিত, তবে তা হয় না। এটি এখনও বদলে যাওয়া ফাইলটি স্টডআউটে প্রদর্শন করে তবে এবার এটি আসলটি মুছে দেয়। আমি আপনাকে এটি ব্যবহার না করার পরামর্শ দিচ্ছি।
একটি শেল স্ক্রিপ্ট বিবেচনা করুন:
#!/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'
। গতি তুলনাযোগ্য কিনা তা দেখার জন্য এটি বড় ইনপুটগুলির পরীক্ষা করতে হবে। (ওএস
shuf
জিনিস মেমরিতে লোড করে, তাই এটি সত্যিকারের বিশাল ফাইলের সাথে কাজ করে না (খনিটি GB 300GB টিএসভি)। এই পার্ল স্ক্রিপ্টটি আমার উপরও ব্যর্থ হয়েছে, তবে ব্যতীত কোনও ত্রুটি ছাড়াই Killed
। পার্ল সলিউশনটি মেমরিতেও সমস্ত কিছু লোড করছে এমন কোনও ধারণা, বা আমি যে অন্য কোনও সমস্যার মুখোমুখি হচ্ছি?
উম্ম, ভুলতে দিচ্ছি না
sort --random-sort
brew install coreutils
সমস্ত ব্যবহারগুলি এগ্রি দিয়ে উপস্থাপিত হয়েছে : gsort --random-sort
বা gshuf
প্রত্যাশা অনুযায়ী কাজ করবে
gsort
এবং gshuf
ইনস্টল করেছিলামport install coreutils
shuf
পরিবর্তে (লিনাক্সে) ব্যবহার বিবেচনা করুন ।
shuf
সেরা উপায়।
sort -R
বেদনাদায়ক ধীর। আমি কেবল 5 জিবি ফাইল বাছাই করার চেষ্টা করেছি। আমি 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-
ফাইলটি পড়ুন, এলোমেলো সংখ্যার সাথে প্রতিটি লাইন প্রিপেন্ড করুন, সেই সমস্ত এলোমেলো উপসাগুলিতে ফাইলটি সাজান, তারপরে উপসর্গগুলি কেটে দিন। এক-লাইনার যা কোনও আধা-আধুনিক শেলটিতে কাজ করা উচিত।
সম্পাদনা: রিচার্ড হ্যানসেনের মন্তব্যকে সংযুক্ত করে।
$RANDOM
), তবে ডেটা কসাই করার জন্য -1। প্রতিস্থাপন করা হচ্ছে while read f
সঙ্গে while IFS= read -r f
প্রতিরোধ করবে read
সরানোর সামনের এবং হোয়াইটস্পেস trailing থেকে (দেখুন এই উত্তর ) এবং ব্যাকস্ল্যাশ প্রক্রিয়াকরণ প্রতিরোধ। একটি নির্দিষ্ট দৈর্ঘ্যের এলোমেলো স্ট্রিং ব্যবহার করে 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()
। এটি অনেকগুলি (২০০০ এর বেশি) উপাদানগুলির সাথে ভালভাবে কাজ করবে না।
জিমের উত্তর সম্পর্কিত:
আমার ~/.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
বলে প্রয়োজনীয় প্রয়োজন $_=<>
))
ফ্রিবিএসডি এর নিজস্ব এলোমেলো উপযোগিতা রয়েছে:
cat $file | random | ...
এটি / usr / গেমস / এলোমেলোভাবে রয়েছে, সুতরাং আপনি গেমগুলি ইনস্টল না করে থাকলে আপনার ভাগ্যের বাইরে।
আপনি টেক্সটপ্রোক / র্যান্ড বা টেক্সটপ্রোক / এমসোর্টের মতো পোর্টগুলি ইনস্টল করার বিষয়ে বিবেচনা করতে পারেন। পোর্টেবিলিটিটি যদি উদ্বেগের বিষয় থাকে তবে লিনাক্স এবং / অথবা ম্যাক ওএস এক্সে এগুলি সম্ভবত উপলব্ধ।
ওএসএক্স-এ, http://ftp.gnu.org/gnu/coreutils/ থেকে সর্বশেষ কিছু গ্রহণ করা like
। / কনফিগার মেক সুডো মেক ইনস্টল
... আপনাকে / ইউএসআর / লোকাল / বিন / সাজান - র্যাণ্ডম-বাছাই করা উচিত
গোলযোগ না করে / usr / বিন / সাজান
অথবা ম্যাকপোর্টস থেকে এটি পান:
$ sudo port install coreutils
এবং / অথবা
$ /opt/local//libexec/gnubin/sort --random-sort