বিভক্ত: বিভিন্ন শতাংশে বিভক্ত কিভাবে?


14

স্প্লিট কমান্ড ব্যবহার করে আমি কীভাবে কোনও পাঠ্য ফাইলকে 70% এবং 30% এ বিভক্ত করতে পারি?


আপনি কি বিভক্ত কমান্ড ব্যবহার বিবাহ করছেন? যদি তা না হয় তবে আপনি সহজেই পার্ল বা পাইথন ব্যবহার করে সরাসরি টেক্সট ম্যানিপুলেশন দিয়ে এটি করতে পারেন। যতক্ষণ না ফাইল খুব বেশি ভুল না হয়, স্ট্রিং হিসাবে এটি মেমরিতে পড়ুন, তারপরে স্ট্রিংটি বিভক্ত করুন। ফাইলটি যদি খুব বড় হয় তবে আরও কাজ করা দরকার।
ফাহিম মিঠা

@ ফাহিম মিঠা ফাইলটি 64 এমবি। আমি বিভাজনটি ব্যবহার করার ধারণাটি পছন্দ করি কারণ এটি কোড লেখার চেয়ে দ্রুত। আমি এখন অবাক হয়েছি আমি যদি ফাইলটির 70% সংযুক্ত রেখার সংখ্যা উল্লেখ করি তবে আমি একটি বড় ফাইল এবং একটি ছোট ফাইল পাই। এটা কাজ করা উচিত নয়?
aneuryzm

এবং হ্যাঁ .. এটি কাজ করেছে .. আমি প্রশ্ন মুছে ফেলা উচিত?
aneuryzm

আপনার উপর নির্ভর করে তবে প্রয়োজনীয় নয়।
ফাহিম মিঠা

আপনার উত্তর ভাগ করুন। ( Meta.stackexchange.com/questions/12513/... )
dogbane

উত্তর:


13

দ্রুত এবং নোংরা পদ্ধতির জন্য নীচের কমান্ডগুলি 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

1
MacOSX ডাব্লুসিটি কখনও কখনও এর সামনে একটি স্পেস সহ লাইনের সংখ্যা প্রদান করে, যা এই স্ক্রিপ্টটি ভেঙে দেয়। Xargs এ প্রথম পাইপিং সেই স্থানগুলি সরিয়ে ফেলবে এবং জিনিসগুলিকে আবার কাজ করতে সক্ষম করবে: split -l $[ $(wc -l filename | xargs | cut -d" " -f1) * 70 / 100 ] filename
এমিল স্টেনস্ট্রোম

4

আপনি 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গুলি বোবা এবং মানগুলি মেনে চলে না তাই এটি সমস্ত সেটআপগুলিতে কাজ করবে না ...


2
{   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


0

নিম্নলিখিত কোড ব্যবহার করে 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.