একটি পাঠ্য ফাইলের রেখার মাঝের বিভাগটি বের করুন?


17

আমি এটি থেকে ডাটাবেস সন্নিবেশ করতে একটি বৃহত পাঠ্য ফাইল পার্স করার জন্য একটি পিএইচপি স্ক্রিপ্ট লিখছি। তবে আমার হোস্টে, ফাইলটি খুব বড় এবং আমি পিএইচপি-র জন্য মেমরির সীমাটিকে আঘাত করেছি।

ফাইলটির প্রায় 16,000 লাইন রয়েছে; আমি এগুলি চারটি পৃথক ফাইলে ভাগ করতে চাই (প্রথমে) আমি সেগুলি লোড করতে পারি কিনা তা দেখতে।

প্রথম অংশটি আমি পেতে পারি head -4000 file.txt। মাঝের বিভাগগুলি সামান্য কৌশলযুক্ত - আমি পাইপ tailআউটপুটটি head( tail -4001 file.txt | head -4000 > section2.txt) এ পাইপ করার বিষয়ে ভাবছিলাম , তবে এর থেকে অন্য কোনও / ভাল উপায় আছে কি?

প্রকৃতপক্ষে আমার যুক্তি বিশৃঙ্খলাবদ্ধ - বিভাগের দ্বিতীয়টির জন্য আমার এমন কিছু হওয়া দরকার tail -12001 file.txt | head - 4000এবং তারপরে tailপরবর্তী বিভাগগুলির জন্য যুক্তিটি কমিয়ে আনতে হবে । আমি ইতিমধ্যে মিশে যাচ্ছি! : P: P

উত্তর:


27

আপনি যদি বিশৃঙ্খলা না করতে চান তবে তবুও এটি ব্যবহার করে tailএবং head, tailশুরু থেকে লাইন-কাউন্ট ব্যবহার করে অনুরোধ করার একটি কার্যকর উপায় রয়েছে , শেষ নয়:

tail -n +4001 yourfile | head -4000

... তবে কেবলমাত্র ফাইলগুলি বিভাজনের জন্য তৈরি একটি আরও ভাল, স্বয়ংক্রিয় সরঞ্জামকে বলা হয় ... split! এটি জিএনইউ কোর্টিলেরও একটি অংশ, সুতরাং যে কোনও সাধারণ লিনাক্স সিস্টেমের এটি থাকা উচিত। আপনি এটি কীভাবে ব্যবহার করতে পারেন তা এখানে:

split -l 4000 yourInputFile thePrefixForOutputFiles

( man splitসন্দেহ হলে দেখুন ।)


19

আপনার মতো মাথা এবং লেজের সংমিশ্রণটি কাজ করবে তবে এর জন্য আমি ব্যবহার করব sed

sed -n '1,4000p' input_file # print lines 1-4000 of input_file

এটি আপনাকে দ্রুত শেল ফাংশন দিয়ে আপনার সমস্যার সমাধান করতে দেয়

chunk_it(){
    step=4
    start=1
    end=$step
    for n in {1..4} ; do
        sed -n "${start},${end}p" "$1" > "$1".$start-$end
        let start+=$step
        let end+=$step
    done
}

chunk_it your_file

এখন আপনি আপনার_ফায়াল .1-4000 এবং yuor_file.4001-8000 এবং আরও।

দ্রষ্টব্য: বাশ দরকার


3
আমি সিড উপায় পছন্দ।
fanchyna

এটি আমার পক্ষে কাজ করে না কারণ সেড প্রস্থান করে না। এটি স্টাডআউট করতে চাইলে লাইনগুলি মুদ্রণ করে, তবে আমাকে সিটিআরএল-সি করতে হবে, ফলস্বরূপ, আমি এটিকে কোনও ফাইলে পুনর্নির্দেশ করতে পারি না। এটি ব্যবহারযোগ্য করার জন্য কোনও পরামর্শ?
ব্রেন্ট 212

এটি বের করে! "সেড-এন '<স্টার্ট_লাইন>, <end_line> ডাব্লু <আউটপুট_ফাইলে>' <ইনপুট_ফাইলে>" আমার পক্ষে কাজ করে।
ব্রেন্ট 212

@ ব্রেন্ট 212 নোট করার আরেকটি বিকল্প হ'ল আপনি এটিকে কমও পাইপ করতে পারেন বা আউটপুটটিকে কোনও ফাইলে পুনর্নির্দেশ করতে পারেন।
কাইল এর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.