আপনার সাথে sed:
sed '24q;1,5d;12,18d' <infile >outfile
... সম্ভবত আরও কার্যকর সমাধান হতে পারে head। ডোন ইতিমধ্যে দেখিয়েছে যে এটি কীভাবে খুব ভালভাবে কাজ করতে পারে তবে আমি এটির সাথেও খেলছি। এই নির্দিষ্ট কেসটি পরিচালনা করতে আপনি কিছু করতে পারেন:
for n in 5 6 7 6
do head -n"$n" >&"$((1+n%2))"
done <infile >outfile 2>/dev/null
... যা head4 বার লিখতে কল করবে outfileবা তার /dev/nullউপর নির্ভর করবে যে সেই পুনরাবৃত্তির মান $nএকটি সমান বা বিজোড় সংখ্যা কিনা on
আরও সাধারণ ক্ষেত্রে, আমি ইতিমধ্যে আমার কাছে থাকা অন্য কিছু জিনিস থেকে এটি একত্রে আবদ্ধ করেছি:
somehead()(
### call it like:
### somehead -[repeat] [-][numlines]* <infile >outfile
set -e -- "${1#-}" "$@" #-e for arg validation
r=; cd -- "${TMP:-/tmp}" #go to tmp
dd bs=4096 of="$$$$" <&4 2>&3 & #dd <in >tmpfile &bg
until [ -s "$$$$" ]; do :; done #wait while tmpfile empty
exec <"$$$$" 4<&-; rm "$$$$" #<tmpfile; rm tmpfile
[ "$3${1}0" -ne "$3${2#?}0" ] || #validate args - chk $1
shift "$(((r=-${1:--1})||1))"; shift #shift 1||2
while [ "$(((r+=(_n=1))-1))" -ne 0 ] && #while ! $rptmax &&
IFS= read -r l && # ! EOF &&
printf "%.$(($1>0?${#l}+1:0))s" "$l # ? printf do
"; do for n do [ "${n#-}" -gt 0 ] || exit #args all -[nums>0]
head "-n$((${n#-}-_n))" >&"$((n>(_n=0)?1:3))" #head -n?$1 >?[+-]
done; done #done and done
) 4<&0 3>/dev/null #4<for dd 3>for head
এটি আপনার জিনিস যেমন করতে পারে:
seq 100 | somehead -1 -5 6 -7 6
... যা ছাপায় ...
6
7
8
9
10
11
19
20
21
22
23
24
এটি আশা করে যে এটির প্রথম আরগটি একটি -, বা, ব্যর্থ হয়েছে, কেবল ক এর সাথে পূর্ববর্তিত পুনরাবৃত্তি গণনা হবে -। যদি কোনও গণনা সরবরাহ করা হয় তবে এটি নিম্নলিখিত বার্তাগুলিতে প্রদত্ত রেখার প্যাটার্নটি যতবার নির্দিষ্ট করা হয়েছে তার পুনরাবৃত্তি করবে এবং এটি করার সাথে সাথে এটি বন্ধ হয়ে যাবে।
নিম্নলিখিত প্রতিটি আর্গের জন্য এটি কোনও লাইন-কাউন্টকে নির্দেশ করতে একটি aণাত্মক পূর্ণসংখ্যার ব্যাখ্যা করবে যা একটি লিখন গণনা /dev/nullএবং একটি লিখন গণনা যা একটি লিখিত উচিত তা নির্দেশ করার জন্য ধনাত্মক পূর্ণসংখ্যার ব্যাখ্যা করবে stdout।
সুতরাং উপরের উদাহরণে এটি প্রথম 5 টি লাইন প্রিন্ট করে /dev/null, পরের 6 থেকে stdoutপরেরটি, পরের 7 থেকে /dev/nullআবার এবং পরের 6 আবার একবার stdout। এর আরোগুলির শেষের দিকে পৌঁছে এবং -1পুনরাবৃত্ত গণনার মাধ্যমে পুরোপুরি চক্রাকারে চলে যাওয়ার পরে এটি প্রস্থান করে। প্রথম তর্কটি যদি হয় তবে -2এটি আরও একবার প্রক্রিয়াটি পুনরাবৃত্তি করতে পারে, বা -যতক্ষণ পারত।
প্রতিটি আরগ চক্রের জন্য whileলুপটি একবারের মাধ্যমে প্রক্রিয়া করা হয়। প্রতিটি লুপের শীর্ষে প্রথম লাইনটি stdinশেল ভেরিয়েবলে পড়ে $l। এটি প্রয়োজনীয় কারণ while head </dev/null; do :; doneঅনির্দিষ্টকালের জন্য পুনরাবৃত্তি হবে - headএটি ফাইলের শেষের দিকে পৌঁছলে তার ফিরতিতে নির্দেশ করে। সুতরাং ইওএফের বিরুদ্ধে চেকটি উত্সর্গীকৃত readএবং কেবলমাত্র দ্বিতীয় তর্কটি ধনাত্মক পূর্ণসংখ্য হলে কেবল একটি নতুন লাইন printfলিখবে ।$lstdout
readচেক লুপ একটু complicates কারণ অবিলম্বে পরে অন্য লুপ বলা হয় - একটি forলুপ যা args উপর iterates 2-$#মধ্যে প্রতিনিধিত্ব হিসাবে $nতার পিতা বা মাতা প্রতিটি পুনরাবৃত্তির জন্য whileলুপ। এর অর্থ হ'ল প্রতিটি পুনরাবৃত্তির জন্য কমান্ড লাইনে নির্দিষ্ট মান থেকে প্রথম আরগটি হ্রাস করতে হবে, তবে অন্য সকলকে তাদের মূল মানগুলি ধরে রাখতে হবে, এবং তাই $_nচিহ্নিতকারী ভারের মান প্রতিটি থেকে বিয়োগ করা হয়, তবে কেবল কখনও ধরে রাখে প্রথম আর্গের জন্য 0 এর চেয়ে বড় মান।
এটি ফাংশনের মূল লুপটি গঠন করে, তবে কোডের বেশিরভাগ অংশ শীর্ষে থাকে এবং এটি ফাংশনটিকে পরিষ্কারভাবে ইনপুট হিসাবে একটি পাইপ এমনকি বাফার করতে সক্ষম করার উদ্দেশ্যে is এটি প্রথমে ব্যাকগ্রাউন্ডে কল করে কাজ করে এটি dd4 টুকরো টুকরো এর ব্লক আকারে আউটপুটটিতে একটি টেম্পফাইলে অনুলিপি করতে। ফাংশনটি এরপরে একটি হোল্ড লুপ সেট আপ করে - যা প্রায় কোনও একক সম্পূর্ণ চক্রও শেষ করা উচিত নয় - কেবলমাত্র এটি নিশ্চিত করার জন্য যে ddফাংশনের আগে ফাইলটিতে কমপক্ষে একটি লিখিত রচনা তৈরি হয়েছে তারপরে তার স্টিডিনকে টেম্পফিলের সাথে যুক্ত ফাইল বর্ণনাকারীর সাথে প্রতিস্থাপন করবে এবং এরপরে তত্ক্ষণাত্ ফাইলটি লিঙ্কযুক্ত করেrm। এটি ফাংশনটি ফাঁদগুলির প্রয়োজনীয়তা ছাড়াই বা অন্যথায় ক্লিনআপের জন্য প্রবাহকে নির্ভরযোগ্যভাবে প্রক্রিয়াজাত করতে সক্ষম করে - fd এ দাবি করা ফাংশনটি প্রকাশের সাথে সাথেই টেম্পফাইলটি বন্ধ হয়ে যাবে কারণ এর নামকরণ করা ফাইলসিস্টেম লিঙ্কটি ইতিমধ্যে সরানো হয়েছে।
headএবংtail? যদি তা হয় তবে আপনার সমাধানটি আপনি সবচেয়ে ভাল করতে পারেন। আপনি যদি অন্যান্য প্রোগ্রাম ব্যবহারের অনুমতি পেয়ে থাকেন,sedবাawkউত্তম সমাধানের জন্য অনুমতি দিতে পারেন (অর্থাত্ কম প্রক্রিয়া আমন্ত্রণের সাথে)।