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