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एक सम या विषम संख्या है।
अधिक सामान्य मामलों के लिए, मैंने इसे कुछ अन्य सामानों से एक साथ सिल दिया था जो मेरे पास पहले से थे:
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
यह उम्मीद करता है कि इसका पहला arg एक बार के साथ उपसर्ग दोहराए जाने की गिनती हो -, या, असफल होकर , बस एक -। यदि कोई गणना प्रदान की जाती है, तो यह निम्न आर्गनों में दी गई लाइन पैटर्न को कई बार निर्दिष्ट करेगी और जैसे ही उसने ऐसा किया है, रुक जाएगी।
प्रत्येक arg के लिए जो इसका अनुसरण करता है एक लाइन-काउंट को इंगित करने के लिए एक नकारात्मक पूर्णांक की व्याख्या करेगा, जिसे लिखा जाना चाहिए /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जांच पाश एक छोटे से पेचीदा हो क्योंकि तुरंत बाद एक और पाश कहा जाता है - एक forपाश जो आर्ग से अधिक iterates 2-$#में प्रतिनिधित्व के रूप में $nअपनी मूल के प्रत्येक यात्रा के लिए whileपाश। इसका मतलब यह है कि प्रत्येक पुनरावृत्ति के लिए पहले arg को कमांड लाइन पर निर्दिष्ट मान से एक से घटाया जाना चाहिए, लेकिन अन्य सभी को अपने मूल मानों को बनाए रखना चाहिए, और इसलिए $_nमार्कर var का मान प्रत्येक से घटाया जाता है, लेकिन कभी-कभी एक मान रखता है पहले arg के लिए 0 से अधिक मूल्य।
यह फ़ंक्शन के मुख्य लूप का गठन करता है, लेकिन कोड का थोक शीर्ष पर है और इसका उद्देश्य फ़ंक्शन को इनपुट के रूप में एक पाइप से भी साफ बफर करने में सक्षम करना है। यह पहली बार dd4k के एक टुकड़े के उत्पादन पर एक tmpfile में अपनी कॉपी करने के लिए एक पृष्ठभूमि को बुलाकर काम करता है । फ़ंक्शन तब एक होल्ड लूप सेट करता है - जिसे लगभग कभी भी एक पूर्ण चक्र पूरा नहीं करना चाहिए - बस यह सुनिश्चित करने के लिए कि ddफ़ंक्शन से पहले फ़ाइल में कम से कम एक ही लिखना है फिर अपने स्टड को एक फ़ाइल विवरणक के साथ बदल देता है जिसे tmpfile से जोड़ा गया है और बाद में तुरंत फ़ाइल को अनलिंक कर देता हैrm। यह फ़ंक्शन को मज़बूती से ट्रैप की आवश्यकता के बिना या क्लीनअप के लिए स्ट्रीम को संसाधित करने में सक्षम बनाता है - जैसे ही फ़ंक्शन जारी करता है यह fd पर दावा करता है tmpfile मौजूद नहीं रहेगा क्योंकि इसका एकमात्र नामित फ़ाइल सिस्टम लिंक पहले ही हटा दिया गया है।
headऔरtail? यदि हां, तो आपका समाधान बहुत अच्छा है जो आप कर सकते हैं। यदि आपको अन्य कार्यक्रमों का उपयोग करने की अनुमति है,sedयाawkअच्छे समाधानों के लिए अनुमति दे सकते हैं (यानी कम प्रक्रिया चालान के साथ)।