কোনও পাঠ্য ফাইলের মধ্যে ভাগ করার সবচেয়ে ভাল উপায় কী?


উত্তর:


12

আপনি চেষ্টা করতে পারেন:

cat textfile | head -n 45 | tail -n 26

অথবা

cat textfile | awk "20 <= NR && NR <= 45" 

হালনাগাদ:

যেমন মাহমোদ্দিল উল্লেখ করেছেন, catএটি প্রয়োজনীয় নয় এবং কিছুটা বাড়াবাড়ি, তবে এটি একটি পরিষ্কার, পাঠযোগ্য কমান্ড তৈরি করে।

যদি catআপনাকে বিরক্ত করে, তবে আরও ভাল সমাধান হ'ল:

<textfile awk "20 <= NR && NR <= 45"

2
awk NR==20,NR==45 textfileখুব কাজ করে, এবং সহজেই পড়তে পারে।
— প্রশংসাপত্র

আমি স্টিডিনের ব্যবহার বেশি পছন্দ করি, এটির নিক্সের সাথে কিছুটা বৈশ্বিক সঙ্গতি রয়েছে
— স্টেফান

1
কমান্ড লাইন আর্গুমেন্টগুলি পড়ার সাথে অন্যান্য ইউএনআইএক্স ইউটিলিটিগুলির সাথেও সামঞ্জস্যতা রয়েছে এবং আমার মূল বক্তব্য ছিল অ্যাডকের ,রেঞ্জ অপারেটর প্রদর্শন করা।
— প্রশংসাপত্র

হ্যাঁ, আমি @ অ্যাডাম বোঝাতে চাইছি। তবে হ্যাঁ, আমি আপনার পরামর্শটি পছন্দ করি
— স্টেফান

আমি মনে করি @ পূর্বসূরীর উত্তরটি এখানে সেরা। অন্যথায়, কমান্ডগুলি বরং ক্রিপ্টিক।
— লিও লোপোল্ড হার্টজ 준영

13

এমনকি সহজ:

sed -n '20,45p;45q' < textfile

-N পতাকা ডিফল্ট আউটপুট অক্ষম করে। "20,45" 20 থেকে 45 লাইনগুলিকে সম্বোধন করে। "P" কমান্ড বর্তমান লাইনটি মুদ্রণ করে। এবং কি লাইন মুদ্রণ পরে প্রস্থান।


1
+1 সুন্দর, আমি পছন্দ করি তবে এর লাইন 20 থেকে 45 :)
— স্টেফান

1
ঠিক আছে, আমি 20,45 :-) বলার জন্য এটি সম্পাদনা করেছি
— dkagedal

27169334-লাইন ফাইল থেকে 26995107 একক লাইন উত্তোলন করার সময় qকমান্ডটি (থেকে শুরু করা সমস্ত কিছু ;) আমার পক্ষে উন্নত কর্মক্ষমতা উন্নত।
— রুসলান

6

এটি কোনও উত্তর নয় তবে এটি কোনও মন্তব্য হিসাবে পোস্ট করতে পারে না।

এটি করার আরেকটি (খুব দ্রুত) উপায় এখানে মাইক্রজার দ্বারা পরামর্শ করেছিলেন :

{ 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বা quit করতে হবে:

স্টিফান :

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

+1 আমি মনে করি এটি এখানে সেরা উত্তর! awk NR==1000020,NR==1000045 textfileআপনার সিস্টেমে এটির সাথে কতটা সময় লাগে তা পেয়ে ভাল লাগবে ।
— লিও লোপোল্ড হার্টজ 준영

3
ruby -ne 'print if 20 .. 45' file

1
সহকর্মী রুবিবাদক, আপনি আমার ভোট স্যার পেয়ে যাবেন
— স্টেফান

1
আমরা যখন এটি করছি, কেন python -c 'import fileinput, sys; [sys.stdout.write(line) for nr, line in enumerate(fileinput.input()) if 19 <= nr <= 44]'খুব বেশি নয় ? :- পি এটি এমন কিছু যা পার্লের পরে মডেল করা, রুবি খুব সহজেই করতে পারে by
— প্রশংসাপত্র

2

যেহেতু সেড এবং অ্যাজক ইতিমধ্যে নেওয়া হয়েছিল, তাই এখানে একটি পার্ল সমাধান রয়েছে:

perl -nle "print if ($. > 19 && $. < 46)" < textfile

বা, মতামত হিসাবে উল্লেখ করা:

perl -ne 'print if 20..45' textfile

2
এই সমস্ত অতিরিক্ত চরিত্রের সাথে কী আছে? নতুন লাইনগুলি স্ট্রিপ এবং পুনরায় যুক্ত করার দরকার নেই, ফ্লিপ-ফ্লপ লাইন সংখ্যার সাথে তুলনা করে ধরে নেওয়া হয় এবং যদি সরবরাহ করা হয় তবে ডায়মন্ড অপারেটর আর্গুমেন্টের মাধ্যমে চলে। perl -ne'print if 20..45' textfile
— প্রশংসাপত্র

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