একটি নির্দিষ্ট লাইনে একটি ফাইল দুটি ফাইলে বিভক্ত করুন


12

আমি ইউনিক্সে একটি উপায়কে সন্ধান করছি একটি প্রদত্ত রেখা সংখ্যায় একটি ফাইলকে দুটি ফাইলে বিভক্ত করতে।

split -l 100 file_nameআমি যা খুঁজছি তার কাছাকাছি, তবে এই কমান্ডটি 100 টি লাইনের প্রতিটি একাধিক ফাইল তৈরি করে। আমি একটি প্রদত্ত লাইন নম্বরে একটি ফাইল দুটি ফাইলে বিভক্ত করার জন্য একটি কমান্ড সন্ধান করছি। ইউনিক্সে এটি করার কোনও উপায় আছে?

উত্তর:


13

কিছুটা শক্ত সমাধান:

(head -100 > f1.txt; cat > f2.txt) < input.txt

1
সুন্দর সমাধান। এর wcআগে কোনও গণনা করা হয়নি এবং সমাধানের মতো ইনপুট ফাইলটি কেবল একবারে প্রক্রিয়া করা হবে awk
দুবু

2
একটি সামান্য সুযোগ রয়েছে যা headআউটপুট দেওয়ার প্রথম 100 লাইনগুলি সন্ধানের জন্য 100 টিরও বেশি লাইন পড়বে f1.txt; এই অতিরিক্ত বাইটগুলি দ্বারা দেখা হবে না cat
চ্যানার

এটি এতটাই ধীর
sdaffa23fdsf

12

ব্যবহার করুন awk, যাতে আপনাকে ইনপুট ফাইলটি দিয়ে কেবল একটি পাস করতে হবে। নিম্নলিখিতটি ধরে নেওয়া হয়েছে যে আপনি প্রথম ফাইলটিতে প্রথম 122 টি লাইন এবং দ্বিতীয়টিতে বাকীটি চান।

awk 'NR < 123 { print >> "top_file"; next } {print >> "bottom_file" }' file_name

এটি একটি থাম্বস আপ প্রাপ্য। আপনি যদি কোনও ফাইলকে এক্স থেকে ওয়াইতে বিভক্ত করতে চান তবে এটি সবচেয়ে সহজ।
গ্লেন প্লাস

এটি বোঝার সবচেয়ে সহজ সমাধান। মনোমুগ্ধকর মতো কাজ করেছে ... এবং আমাকে মনে করে যে আমার ও'রিলি শেড ও অজব বইয়ের ধুলোটি ব্রাশ করা উচিত ১৯৯৯ বা তার পর থেকে, সেড বিভাগটি বেশ পঠিত, বিশ্রী বিভাগ এত বেশি নয়।
মাইকেল

মন্তব্যগুলিতে @ চেপারার উল্লেখ করার কারণে এটি ব্যতীত সমাধানের চেয়ে ভাল। আপনি 'f2.txt' ফাইলটিতে অক্ষরগুলি শিথিল করবেন। এই সমাধানটি নির্ভুল এবং দক্ষ। awk ftw।
গোরান

7

আপনি উভয় অংশ পেতে headএবং ব্যবহার করতে পারেন tail:

head -n K file_name > top_file
tail -n L file_name > bottom_file

Kলাইন নম্বরটি কোথায় এবং Lনীচের দিক থেকে রেখার সংখ্যা (লাইনগুলির মোট সংখ্যা - K)।

(আপনি মোট লাইন সংখ্যা ব্যবহার করে পেতে পারেন wc -l file_name)।


5

আপনি এটি করতে csplit(যদি উপলব্ধ থাকে) ব্যবহার করতে পারেন :

csplit file N+1

ফাইলটিকে দুটি টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো করা হবে, এক টুকরা লাইন নম্বর পর্যন্ত (এবং সহ) লাইন নম্বর Nথেকে N+1শেষ লাইন পর্যন্ত অন্য টুকরা line
আপনি যদি লাইন নম্বরটিতে বিভক্ত করতে চান (তবে অন্তর্ভুক্ত নয়) N:

csplit file N

ওটা দারুন! ধন্যবাদ, এটি আমার জন্য সমস্যাটি পুরোপুরি সমাধান করেছে solved
জের্টিন

20 গিগাবাইট ফাইলটি টুকরো টুকরো করার জন্য সেরা পারফরম্যান্স।
dr0i

@ dr0i - এতে অবাক হওয়ার কিছু নেই, csplitএই কাজের জন্য এটি অনুকূলিত।
don_crissti

২০০ এম-লাইন-ফাইল বিভক্ত করে ২০০৮-এর দিকে তারিখের সিএসপিপ্লিট ব্যবহার করে আমি "স্মৃতিশক্তি অবসন্ন" হয়ে গেলাম। ২০১১-এর তারিখের সিএসপি্লিট ব্যবহার করা এটি কাজ করে :)
dr0i

4

উভয়ই আছে headএবং tailঅন্যথায় যেমন হয় তার চেয়ে ফাইলটির "অন্যান্য" প্রান্ত থেকে লাইন তৈরির বিকল্প রয়েছে। সুতরাং আপনার কাছে এই দুটি বিকল্প রয়েছে:

head -n 100 source.txt > file1.txt
head -n -100 source.txt > file2.txt

বা (যেখানে এনএনএন আউটপুটের চেয়ে 100 কম wc -l source.txt):

tail -n +NNN source.txt > file1.txt
tail -n NNN source.txt > file.txt

আপনি আপনার সংস্করণ headএবং tailআরও তথ্যের জন্য ম্যানুয়াল পৃষ্ঠাগুলি পড়তে পারেন ।


0

আপনি 'ডাব্লুসি', 'ডিসি', 'হেড' এবং 'লেজ' ব্যবহার করতে পারেন। অর্থাত

unix> wc -l foo
545 /tmp/foo
unix> dc -e '545 100 - p'
445
unix> head -n 100 foo > filea
unix> tail -n 445 foo > fileb

ব্যবহারের সহজতার জন্য, আপনি উপরের শেল স্ক্রিপ্টে রূপান্তর করতে পারেন।

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