আমি কীভাবে রেড হ্যাট লিনাক্সের স্ট্যান্ডার্ড সরঞ্জাম ব্যবহার করে কোনও ফাইলের লাইনগুলিকে এলোমেলো করতে পারি?


102

আমি কীভাবে রেড হ্যাট লিনাক্সের স্ট্যান্ডার্ড সরঞ্জাম ব্যবহার করে কোনও ফাইলের লাইনগুলিকে এলোমেলো করতে পারি?

আমার কাছে shufআদেশ নেই, তাই আমি একই কাজটি সম্পাদনকারী perlবা awkএক-লাইনারের মতো কিছু সন্ধান করছি ।


1
আমি প্রায় একই প্রশ্ন [জিজ্ঞাসা stackoverflow.com/questions/286640/...
স্টিভ Schnepp


আমি যেকোন লিনাক্সে জিসিসি একটি মানক সরঞ্জাম হিসাবে বিবেচনা করি। ; ডি
এমএসবি 20

উত্তর:


64

এবং একটি পার্ল এক-লাইনার আপনি পান!

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

স্বাক্ষরিত তবে আশাবাদী কাজ করে।


আসল ফাইলটির ব্যাকআপ নিতে, আপনি -i পতাকাটিতে একটি এক্সটেনশন প্রত্যাহার
স্টিভ স্নেপ

আমি সাধারণত একটি পার্ল ফ্যান, কিন্তু এই রুবি উদাহরণ যা খাটো হচ্ছে সুবিধা রয়েছে জুড়ে এসেছিল: ruby -e 'puts STDIN.readlines.shuffle'। গতি তুলনাযোগ্য কিনা তা দেখার জন্য এটি বড় ইনপুটগুলির পরীক্ষা করতে হবে। (ওএস
এক্সেও

নীচের মন্তব্যে প্রতিটি shufজিনিস মেমরিতে লোড করে, তাই এটি সত্যিকারের বিশাল ফাইলের সাথে কাজ করে না (খনিটি GB 300GB টিএসভি)। এই পার্ল স্ক্রিপ্টটি আমার উপরও ব্যর্থ হয়েছে, তবে ব্যতীত কোনও ত্রুটি ছাড়াই Killed। পার্ল সলিউশনটি মেমরিতেও সমস্ত কিছু লোড করছে এমন কোনও ধারণা, বা আমি যে অন্য কোনও সমস্যার মুখোমুখি হচ্ছি?
seth127

211

উম্ম, ভুলতে দিচ্ছি না

sort --random-sort

1
ঠিক আছে, আমি gnu-coreutils 7.1 (স্ট্যান্ডার্ড ভদ্রলোক ইনস্টল) ব্যবহার করছি, যা এই বিকল্পটি অনুসারে সাজিয়েছে, কখন প্রকাশিত হয়েছে তা নিশ্চিত নয়, বা এটি অন্য বাস্তবায়নে রয়েছে কি না।
জিম টি

1
বৈশিষ্ট্যটি 10 ​​ই ডিসেম্বর 2005-এ প্রতিশ্রুতিবদ্ধ হয়েছিল, এর পরে প্রকাশিতটি 5.94 ছিল, সুতরাং আমি অনুমান করছি যে এটি সংস্করণ থেকে পাওয়া যায়।
জিম টি

41
ওএস এক্স-এ আপনি হোমব্রিউ সহ গ্নু কোর্টিলগুলি ইনস্টল করতে পারেন: brew install coreutilsসমস্ত ব্যবহারগুলি এগ্রি দিয়ে উপস্থাপিত হয়েছে : gsort --random-sortবা gshufপ্রত্যাশা অনুযায়ী কাজ করবে
মাইক

3
+1 @ মাইক আমি ম্যাকপোর্টগুলি ব্যবহার করি এবং আমি যখন করেছি gsortএবং gshufইনস্টল করেছিলামport install coreutils
নোহ সুসমান

10
আপনার লাইনে পুনরাবৃত্তি না থাকলে এই সমাধানটি কেবলমাত্র ভাল। যদি তারা তা করে থাকে তবে সেই লাইনের সমস্ত উদাহরণ একে অপরের পাশে উপস্থিত হবে। shufপরিবর্তে (লিনাক্সে) ব্যবহার বিবেচনা করুন ।
আলী জে

118

shuf সেরা উপায়।

sort -Rবেদনাদায়ক ধীর। আমি কেবল 5 জিবি ফাইল বাছাই করার চেষ্টা করেছি। আমি 2.5 ঘন্টা পরে হাল ছেড়ে দিলাম। তারপরে shufএক মিনিটের মধ্যে এটি বাছাই করুন।


এটা অসাধারণ. এটি জিএনইউ কোর্টিলগুলিতে উপস্থিত রয়েছে।
আর্দডেল

4
আমি সন্দেহ করি কারণটি sort -Rধীর কারণ হ'ল প্রতিটি লাইনের জন্য একটি হ্যাশ গণনা করা। ডক্স থেকে: " সাজান ইনপুট কী হ্যাশ এবং তারপর হ্যাশ মান সাজানোর মাধ্যমে আপনাকে। "
জো ফ্লিন

13
সাবধান, shufস্মৃতিতে সবকিছু লোড করে।
jfs

1
@ বেনরোথ: আমি যা বলতে পারি তা থেকে, বড় আকারের ইনপুট গণনা বাড়িয়ে মেমরিটি কিছুটা সহায়তা করতে পারে তবে এটি এখনও সামগ্রিকভাবে ধীর গতিতে। আমার পরীক্ষাগুলিতে, 1 মিলিয়ন-লাইনের ইনপুট ফাইলটি বাছাইয়ের ক্ষেত্রে প্রসেস seq -f 'line %.0f' 1000000করতে একই, দীর্ঘ সময় লেগেছিল (অনেক বেশি, এর চেয়ে অনেক বেশি দীর্ঘ shuf), যতই আমি বরাদ্দ করি না কেন।
mklement0

1
@ এমকিলেটমেন্ট 0, আপনি ঠিক বলেছেন! আমি এর আগে যা ছিল তার থেকে অনেক বড় ফাইল দিয়ে এটি চেষ্টা করেছি এবং হ্যাশিংটি সত্যই বাধা বলে মনে হচ্ছে।
বেনরথ

23
cat yourfile.txt | while IFS= read -r f; do printf "%05d %s\n" "$RANDOM" "$f"; done | sort -n | cut -c7-

ফাইলটি পড়ুন, এলোমেলো সংখ্যার সাথে প্রতিটি লাইন প্রিপেন্ড করুন, সেই সমস্ত এলোমেলো উপসাগুলিতে ফাইলটি সাজান, তারপরে উপসর্গগুলি কেটে দিন। এক-লাইনার যা কোনও আধা-আধুনিক শেলটিতে কাজ করা উচিত।

সম্পাদনা: রিচার্ড হ্যানসেনের মন্তব্যকে সংযুক্ত করে।


1
এটি কাজ করে এবং একটি সৃজনশীল সমাধান, তবে লাইনের শীর্ষস্থানীয় সাদা স্থানকে মুছে ফেলবে।
ক্রিস লুটজ

@ ক্রিস শেষ কাটটি পরিবর্তন করলেন | সেড / এস / ^ [^ \ টি] * \ টি // 'এ ঠিক করতে হবে
বিডনলান

সহজ সরলতার জন্য কুডোস!
শশীকান্ত কোরে

3
পসিক্স কনফরমেন্সের জন্য +1 (বাদে $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-
রিচার্ড হ্যানসেন

3
@ রিচার্ড হ্যানসেন: ধন্যবাদ, এই প্রস্তাবিত পরিবর্তনগুলি স্পষ্টতই উপযুক্ত, আমি আমার পোস্টটি সম্পাদনা করেছি।
ক্রিস্টোফিড

9

পাইথনের জন্য একটি ওয়ান-লাইনার:

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()। এটি অনেকগুলি (২০০০ এর বেশি) উপাদানগুলির সাথে ভালভাবে কাজ করবে না।


5

জিমের উত্তর সম্পর্কিত:

আমার ~/.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বলে প্রয়োজনীয় প্রয়োজন $_=<>))


ওএস এক্স-তে সাজানো-আর এর অস্তিত্ব নেই বলে পুনরাবৃত্তি করা, তবে কিছু দুর্দান্ত পার্ল উত্তরের জন্য, এবং সাধারণভাবে দুর্দান্ত উত্তর answer
ক্রিস লুৎজ

আপনি ওএস এক্সে জিএনইউ কোর্টিলগুলি ইনস্টল করতে পারেন, তবে (যেমন আমি অতীতে করেছি) আপনাকে বিল্ট-ইন সরঞ্জামগুলি না ভাঙতে সতর্কতা অবলম্বন করতে হবে ... বলা হচ্ছে, ওপি রেডহাট লিনাক্সে রয়েছে, যার অবশ্যই জিএনইউ রয়েছে কোর্টিল স্ট্যান্ডার্ড
প্রশংসাপত্র

3

আমি যখন হোমব্রু দিয়ে কোর্টিলগুলি ইনস্টল করি

brew install coreutils

shufহিসাবে উপলব্ধ হয় n


মাতাল সমস্ত কমান্ডের উপসর্গ করা gতাই আমার জন্য shufহয়ে ওঠে gshuf
উয়র্ন

That এ কারণেই কি তারা পসিক্সবিহীন, বা আমি পুরোপুরি বন্ধ?
ডেভ লিউ

1

ডারউইনপোর্টের সাথে ম্যাক ওএস এক্স:

sudo port install unsort
cat $file | unsort | ...

1

ফ্রিবিএসডি এর নিজস্ব এলোমেলো উপযোগিতা রয়েছে:

cat $file | random | ...

এটি / usr / গেমস / এলোমেলোভাবে রয়েছে, সুতরাং আপনি গেমগুলি ইনস্টল না করে থাকলে আপনার ভাগ্যের বাইরে।

আপনি টেক্সটপ্রোক / র্যান্ড বা টেক্সটপ্রোক / এমসোর্টের মতো পোর্টগুলি ইনস্টল করার বিষয়ে বিবেচনা করতে পারেন। পোর্টেবিলিটিটি যদি উদ্বেগের বিষয় থাকে তবে লিনাক্স এবং / অথবা ম্যাক ওএস এক্সে এগুলি সম্ভবত উপলব্ধ।


-1

ওএসএক্স-এ, http://ftp.gnu.org/gnu/coreutils/ থেকে সর্বশেষ কিছু গ্রহণ করা like

। / কনফিগার মেক সুডো মেক ইনস্টল

... আপনাকে / ইউএসআর / লোকাল / বিন / সাজান - র‌্যাণ্ডম-বাছাই করা উচিত

গোলযোগ না করে / usr / বিন / সাজান


এটি OSX (10.7) এ আমার জন্য কাজ করে নি। আমি পেয়েছি "কনফিগার: ত্রুটি: সি সংকলক এক্সিকিউটেবলগুলি তৈরি করতে পারে না"।
দোলান অ্যান্টিনিচি

@ ডোলান আপনার অনুমতি চেক করুন?
বেনুবার্ড

-1

অথবা ম্যাকপোর্টস থেকে এটি পান:

$ sudo port install coreutils

এবং / অথবা

$ /opt/local//libexec/gnubin/sort --random-sort
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.