স্প্লিট কমান্ড ব্যবহার করে আমি কীভাবে কোনও পাঠ্য ফাইলকে 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