2012-01-04 7 views
19

मैं awk स्क्रिप्ट लिखने की कोशिश कर रहा हूं जो कुछ शर्तों की जांच करता है और उन शर्तों को पूरा करने वाली लाइनों को दूर करता है।किसी शर्त को क्रियान्वित होने पर अगली पंक्ति में जाने के लिए आपको अजीब कैसे मिलता है?

विशिष्ट स्थिति फ़ाइल की पहली दो पंक्तियों और xyzzy: के साथ शुरू होने वाली किसी भी पंक्ति को फेंकना है। इसके लिए मैं कोडित:

awk ' 
    NR < 2 {} 
    /^xyzzy:/ {} 
       {print}' 

यह सोच कर कि यह लाइनें जहां उन दो शर्तों में से किसी से मुलाकात की और प्रिंट थे अन्यथा फेंक होगा।

दुर्भाग्यवश, ऐसा लगता है कि print संसाधित किया जा रहा है, भले ही रेखा दो अन्य पैटर्नों में से एक से मेल खाती हो।

क्या सी-जैसे continue कार्रवाई है जो अगली पंक्ति के लिए मौजूदा लाइन के लिए अन्य सभी शर्त जांच को अनदेखा कर देगी?

मुझे लगता है कि मैं तीसरे नियम के रूप में ((NR > 1) && (!/^xyzzy:/)) {print} जैसे कुछ का उपयोग कर सकता हूं लेकिन यह मेरे लिए बदसूरत लगता है।

वैकल्पिक रूप से, ऐसा करने का कोई और तरीका है?

+0

मैं कोई विशेषज्ञ हूँ, लेकिन यहाँ वास्तव में एक अच्छा [ट्यूटोरियल] (http://www.grymoire.com/Unix/Awk है:

आप निम्न मुहावरा देखेंगे। एचटीएमएल) जब मैंने इसे सीखना शुरू किया तो मुझे बहुत मदद मिली। और निश्चित रूप से एक बहुत ही [विस्तृत गाइड] है (http://www.gnu.org/software/gawk/manual/gawk.pdf) भी। लेकिन मुझे किताबों पर ट्यूटोरियल पसंद है। :) –

उत्तर

29

अपनी कार्रवाई के रूप में कीवर्ड next का प्रयोग करें

यह कीवर्ड अक्सर उपयोगी होता है जब आप 2 फ़ाइलों पर पुनरावृति करना चाहते हैं; कभी-कभी यह वही फ़ाइल होती है जिसे आप दो बार संसाधित करना चाहते हैं। `Awk` पर

awk ' 
FNR==NR { 
    < stuff that works on file 1 only > 
    next 
} 
{ 
    < stuff that works on file 2 only > 
}' ./infile1 ./infile2 
+0

आह, पोस्ट करने से पहले पर्लीश 'अगली' कोशिश करनी चाहिए थी। अनुलेख मैंने 'एनआर = <2' की कोशिश की और यह बारफ किया गया ताकि मैं मान रहा हूं कि आपका मतलब' एनआर <= 2' (और तदनुसार तय किया गया है)। चीयर्स। – paxdiablo

+0

ओह, ठीक है, यही मेरा मतलब है। – SiegeX

+1

'अगला' ** ** में से एक ** ** उत्कृष्ट सुविधाओं में से एक है। :) –

संबंधित मुद्दे