একটি বিশাল পাঠ্য ফাইলের মধ্যে 20 -45 লাইন বলার জন্য উত্তোলনের একটি ভাল উপায় কী। অ-ইন্টারেক্টিভভাবে অবশ্যই!
একটি বিশাল পাঠ্য ফাইলের মধ্যে 20 -45 লাইন বলার জন্য উত্তোলনের একটি ভাল উপায় কী। অ-ইন্টারেক্টিভভাবে অবশ্যই!
উত্তর:
আপনি চেষ্টা করতে পারেন:
cat textfile | head -n 45 | tail -n 26
অথবা
cat textfile | awk "20 <= NR && NR <= 45"
হালনাগাদ:
যেমন মাহমোদ্দিল উল্লেখ করেছেন, cat
এটি প্রয়োজনীয় নয় এবং কিছুটা বাড়াবাড়ি, তবে এটি একটি পরিষ্কার, পাঠযোগ্য কমান্ড তৈরি করে।
যদি cat
আপনাকে বিরক্ত করে, তবে আরও ভাল সমাধান হ'ল:
<textfile awk "20 <= NR && NR <= 45"
,
রেঞ্জ অপারেটর প্রদর্শন করা।
এমনকি সহজ:
sed -n '20,45p;45q' < textfile
-N পতাকা ডিফল্ট আউটপুট অক্ষম করে। "20,45" 20 থেকে 45 লাইনগুলিকে সম্বোধন করে। "P" কমান্ড বর্তমান লাইনটি মুদ্রণ করে। এবং কি লাইন মুদ্রণ পরে প্রস্থান।
q
কমান্ডটি (থেকে শুরু করা সমস্ত কিছু ;
) আমার পক্ষে উন্নত কর্মক্ষমতা উন্নত।
এটি কোনও উত্তর নয় তবে এটি কোনও মন্তব্য হিসাবে পোস্ট করতে পারে না।
এটি করার আরেকটি (খুব দ্রুত) উপায় এখানে মাইক্রজার দ্বারা পরামর্শ করেছিলেন :
{ head -n 19 >/dev/null; head -n 26; } <infile
এখানে এবং একই পদ্ধতি হিসাবে একই পরীক্ষার ফাইলটি ব্যবহার করে এখানে কিছু মানদণ্ড দেওয়া হয়েছে (1000020-1000045 লাইন উত্তোলন করা):
মাইকজার্ভ :
{ head -n 1000019 >/dev/null; head -n 26; } <iplist
real 0m0.059s
স্টিফান :
head iplist -n 1000045 | tail -n 26
real 0m0.054s
এগুলি এখন পর্যন্ত দ্রুত সমাধান এবং পার্থক্যগুলি নগণ্য (একক পাসের জন্য) (আমি বিভিন্ন রেঞ্জ দিয়ে চেষ্টা করেছি: কয়েক লাইন, কয়েক মিলিয়ন লাইন)।
পাইপ ব্যতীত এটি করা একটি উল্লেখযোগ্য সুবিধা দিতে পারে, তবে, একই অ্যাপ্লিকেশনটিতে অনুরূপ ফ্যাশনের একাধিক রেঞ্জের সন্ধান করা দরকার :
for pass in 0 1 2 3 4 5 6 7 8 9
do printf "pass#$pass:\t"
head -n99 >&3; head -n1
done <<1000LINES 3>/dev/null
$(seq 1000)
1000LINES
... যা ছাপায় ...
pass#0: 100
pass#1: 200
pass#2: 300
pass#3: 400
pass#4: 500
pass#5: 600
pass#6: 700
pass#7: 800
pass#8: 900
pass#9: 1000
... এবং কেবল একবারে ফাইলটি পড়ে।
অন্যান্য sed
/ awk
/ perl
সমাধানগুলি পুরো ফাইলটি পড়ে এবং যেহেতু এটি বিশাল ফাইলগুলি সম্পর্কে, তাই তারা খুব দক্ষ নয়। আমি কিছু বিকল্প নিক্ষেপ করেছি যা নির্দিষ্ট রেঞ্জের শেষ পংক্তির পরে exit
বা q
uit করতে হবে:
স্টিফান :
awk "1000020 <= NR && NR <= 1000045" iplist
real 0m2.448s
বনাম
awk "NR >= 1000020;NR==1000045{exit}" iplist
real 0m0.243s
ডেকেগেডাল ( sed
):
sed -n 1000020,1000045p iplist
real 0m0.947s
বনাম
sed '1,1000019d;1000045q' iplist
real 0m0.143s
স্টিভেন ডি :
perl -ne 'print if 1000020..1000045' iplist
real 0m2.041s
বনাম
perl -ne 'print if $. >= 1000020; exit if $. >= 1000045;' iplist
real 0m0.369s
awk NR==1000020,NR==1000045 textfile
আপনার সিস্টেমে এটির সাথে কতটা সময় লাগে তা পেয়ে ভাল লাগবে ।
ruby -ne 'print if 20 .. 45' file
python -c 'import fileinput, sys; [sys.stdout.write(line) for nr, line in enumerate(fileinput.input()) if 19 <= nr <= 44]'
খুব বেশি নয় ? :- পি এটি এমন কিছু যা পার্লের পরে মডেল করা, রুবি খুব সহজেই করতে পারে by
যেহেতু সেড এবং অ্যাজক ইতিমধ্যে নেওয়া হয়েছিল, তাই এখানে একটি পার্ল সমাধান রয়েছে:
perl -nle "print if ($. > 19 && $. < 46)" < textfile
বা, মতামত হিসাবে উল্লেখ করা:
perl -ne 'print if 20..45' textfile
perl -ne'print if 20..45' textfile
awk NR==20,NR==45 textfile
খুব কাজ করে, এবং সহজেই পড়তে পারে।