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


উত্তর:


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.