আপনি যদি লাইনগুলিকে পুনর্বিন্যাস করতে আপত্তি করেন না এবং আপনার জিএনইউ কোর্টিলস রয়েছে (যেমন shuf
সংস্করণ .0.০-এ প্রকাশিত হওয়ার পরে খুব প্রাচীন নয় ), shuf
("বদলানো") এলোমেলোভাবে কোনও ফাইলের লাইনগুলিকে পুনর্বিন্যাস করে। সুতরাং আপনি ফাইলটি পরিবর্তন করতে পারবেন এবং প্রথম মিটার লাইনগুলি একটি ফাইলে এবং বাকী অন্যটিতে প্রেরণ করতে পারেন।
এই প্রেরণ করার কোনও আদর্শ উপায় নেই। আপনি কেবল চেইন করতে পারবেন না head
এবং tail
কারণ head
এটি সামনে বাফার করবে। আপনি ব্যবহার করতে পারেন split
, তবে আউটপুট ফাইলের নামের সাথে আপনি কোনও নমনীয়তা পাবেন না। আপনি awk
অবশ্যই ব্যবহার করতে পারেন :
<input shuf | awk -v m=$m '{ if (NR <= m) {print >"output1"} else {print} }'
আপনি ব্যবহার করতে পারেন sed
, এটি অস্পষ্ট তবে বড় ফাইলগুলির জন্য সম্ভবত দ্রুত।
<input shuf | sed -e "1,${m} w output1" -e "1,${m} d" >output2
বা tee
আপনার প্ল্যাটফর্মটি থাকলে ডেটা সদৃশ করতে ব্যবহার করতে পারেন /dev/fd
; ঠিক আছে যদি মি ছোট হয়:
<input shuf | { tee /dev/fd/3 | head -n $m >output1; } 3>&1 | tail -n +$(($m+1)) >output2
পোর্টেবলভাবে, আপনি প্রতিটি লাইন ঘুরে ফিরে প্রেরণ করতে বিশ্রী ব্যবহার করতে পারেন। মনে রাখবেন যে এ্যান্ড্কটি এর এলোমেলো নম্বর জেনারেটর শুরু করতে খুব ভাল নয়; এলোমেলোতা কেবল ক্রিপ্টোগ্রাফির জন্য অবশ্যই উপযুক্ত নয়, তবে সংখ্যার সিমুলেশনের জন্য খুব ভালও নয়। এক-দ্বিতীয় সময়কালের সাথে যে কোনও সিস্টেমে সমস্ত বীজ অনুরোধের জন্য বীজ একই হবে।
<input awk -v N=$(wc -l <input) -v m=3 '
BEGIN {srand()}
{
if (rand() * N < m) {--m; print >"output1"} else {print >"output2"}
--N;
}'
আপনার যদি আরও ভাল এলোমেলো প্রয়োজন হয়, আপনি পার্লে একই জিনিসটি করতে পারেন, যা এর আরএনজি শালীনভাবে বীজ করে।
<input perl -e '
open OUT1, ">", "output1" or die $!;
open OUT2, ">", "output2" or die $!;
my $N = `wc -l <input`;
my $m = $ARGV[0];
while (<STDIN>) {
if (rand($N) < $m) { --$m; print OUT1 $_; } else { print OUT2 $_; }
--$N;
}
close OUT1 or die $!;
close OUT2 or die $!;
' 42