স্প্লিট কমান্ড ব্যবহার করে আমি কীভাবে কোনও পাঠ্য ফাইলকে 70% এবং 30% এ বিভক্ত করতে পারি?
স্প্লিট কমান্ড ব্যবহার করে আমি কীভাবে কোনও পাঠ্য ফাইলকে 70% এবং 30% এ বিভক্ত করতে পারি?
উত্তর:
দ্রুত এবং নোংরা পদ্ধতির জন্য নীচের কমান্ডগুলি 50% (যদি আপনি কেবল দুটি ফাইলে বিভক্ত করতে চান) এর শতাংশের জন্য কাজ করবে।
1) লাইনের উপর ভিত্তি করে 70% বিভক্ত করুন
split -l $[ $(wc -l filename|cut -d" " -f1) * 70 / 100 ] filename
2) বাইটের উপর ভিত্তি করে 70% বিভক্ত করুন
split -b $[ $(wc -c filename|cut -d" " -f1) * 70 / 100 ] filename
split -l $[ $(wc -l filename | xargs | cut -d" " -f1) * 70 / 100 ] filename
আপনি csplitদুটি টুকরো (কোনও শতাংশ ব্যবহার করে) বিভক্ত করতে ব্যবহার করতে পারেন যেমন প্রথম টুকরো - প্রথম 20% লাইন, দ্বিতীয় টুকরো - বাকী 80% রেখার:
csplit infile $(( $(wc -l < infile) * 2 / 10 + 1))
$(wc -l < infile): মোট রেখার সংখ্যা
2 / 10: শতাংশ
+1: একটি লাইন যুক্ত করুন কারণ csplitবিভক্ত হয়up to but not including line N
যদিও আপনি কেবল লাইনের ভিত্তিতে বিভক্ত করতে পারেন।
মূলত, যতক্ষণ না আপনার মাধ্যমে লাইন নম্বর থাকে $(( $(wc -l < file) * 2 / 10))আপনি কোনও লাইন-ভিত্তিক সরঞ্জাম ব্যবহার করতে পারেন:
sed 1,$(( $(wc -l < infile) * 2 / 10))'{
w 20-infile
d
}' infile > 80-infile
বা, এমনকি শীতল:
{ head -n$(( $(wc -l < infile) * 2 / 10)) > 20-infile; cat > 80-infile; } <infile
যদিও কিছু headগুলি বোবা এবং মানগুলি মেনে চলে না তাই এটি সমস্ত সেটআপগুলিতে কাজ করবে না ...
{ BS=$(($(wc -c <file) * $P / 100))
dd count=1 bs="$BS" >file1; cat
} <file >file2 2>/dev/null
... এই সাধারণ কেসটির জন্য কাজ করা উচিত কারণ আপনি কেবল একবার বিভাজন করছেন - এবং সম্ভবত splitএটি একটি সামান্য ওভারকিল। তাই দীর্ঘ হিসাবে ফাইল seekable হয়, ddশুধুমাত্র একটি একক কি করতে হবে read()উপর <stdin, এবং তাই catতার শুরু ছেড়ে দেওয়া হয় read()যাই হোক না কেন সময়ে ddপাওয়া যায় না।
যদি ফাইলটি বড় হয় তবে count=1 bs=$big_ol_numএকটিটি কিছুটা অযথাযুক্ত হতে পারে এবং এটি কিছু অতিরিক্ত - তবুও সহজ - শেল ম্যাথ দিয়ে আটকানো যেতে পারে।
একটি অ seekable ইনপুট - একটি পাইপ থেকে মত - তীর্যক পারে dd', s ফলাফল যদিও এই W / গনুহ পাশাপাশি পরিচালনা করা যায় ddএর iflag=fullblock।
নিম্নলিখিত কোড ব্যবহার করে headএবং tailযেকোন অনুপাতের সাথে কাজ করে (এই ক্ষেত্রে 40 থেকে 60):
export FILE_NAME=train.vw
head -n $[ $(wc -l ${FILE_NAME}|cut -d" " -f1) * 40 / 100 ] ${FILE_NAME} > train_40.vw
tail -n +$[ ($(wc -l ${FILE_NAME}|cut -d" " -f1) * 40 / 100) + 1 ] ${FILE_NAME} > train_60.vw