2012-04-19 7 views
10

getline अगली पंक्ति में पढ़ता है और 1. द्वारा NR काउंटर को बढ़ा देता getline, awk शुरू अगली पंक्ति के साथ काम इस्तेमाल करने के बाद। ज्यादातर मामलों में यह वांछित व्यवहार है।पीक, लेकिन उपभोग नहीं करते यह

मेरी विशेष स्थिति में मुझे केवल अगली पंक्ति को देखने की आवश्यकता है और इसकी सामग्री के आधार पर मैंने अगली पंक्ति पढ़ी है या मुझे एक लाइन बैकट्रैक करने की आवश्यकता है।

मैं awk में एक पंक्ति को कैसे बैकट्रैक कर सकता हूं? मैंने NR काउंटर मैन्युअल रूप से NR=NR-1 पर सेट करने का प्रयास किया लेकिन यह काम नहीं करता है। या क्या कोई ऐसी विधि है जो NR को बदले बिना अगली पंक्ति को देखती है?

मुझे एक पंक्ति की तलाश है। बस एक चर में रेखा को सहेजना और बाद में इसका जिक्र करना इस मामले में काम नहीं करता है। मैं awk में एक साक्षर प्रोग्रामिंग टूल को लागू करने की कोशिश कर रहा हूं, जहां एक मास्टर फ़ाइल में कई सबफाइल हो सकते हैं। इस तरह की उप-फ़ाइल "% file:file1" जैसी रेखा से शुरू होती है। ऐसी फ़ाइल का अंत तक पहुंच गया है, यदि निचले इंडेंटेशन वाली रेखा या "% file:file2" जैसी रेखा वाली दूसरी पंक्ति तक पहुंच गई है।

/% file:/ से मेल खाने वाली सभी लाइनों के लिए नियम सेट का उपयोग नहीं किया जाता है, जब मैंने पहले ही इस लाइन को गेटलाइन के साथ पढ़ा है। यही कारण है कि मैं पिछली पंक्ति में NR रीसेट करना चाहता हूं, फिर awk लाइन /% file:/ से मेल खाने वाली लाइन को पढ़ेगा और उपयुक्त नियम निष्पादित किया जाएगा।

+1

मैंने TXR नामक एक टेक्स्ट-मुंगिंग भाषा विकसित की जिसमें पैटर्न-उन्मुख ("लंबवत") और चरित्र उन्मुख ("क्षैतिज") मिलान मोड दोनों में अंतर्निहित बैकट्रैकिंग के साथ मिलान पैटर्न शामिल है। लुकहेड गहराई वर्णों या रेखाओं की मनमानी संख्या है। टीएआरआर एक साक्षर प्रोग्रामिंग नोटेशन को संसाधित करने के कार्य के लिए लगभग आदर्श है। सीधे प्रासंगिक उदाहरण देना मुश्किल है; क्या आप साक्षर नोटेशन का पूर्ण विनिर्देश पोस्ट कर सकते हैं? – Kaz

उत्तर

1

यह एक हैक का एक सा है और काफी महंगा है, लेकिन छोटे फ़ाइलों के लिए आप एक अग्रदर्शी देता है:

cmd="sed -n " NR + 1 "p " FILENAME; cmd | getline nextline 

कि एनआर के वर्तमान मूल्य लेने के लिए और लाइन एन.आर. निकालने के लिए एसईडी का उपयोग करेगा + 1 इनपुट फ़ाइल से। यह महंगा है क्योंकि हर बार जब आप एक लुकहेड करते हैं तो आप पूरी फ़ाइल के माध्यम से पढ़ेंगे (आप इसे 'q' कमांड को sed में थोड़ा सा कम कर सकते हैं)। परिवर्तनीय अगली पंक्ति फ़ाइल की अगली पंक्ति पर सेट की जाएगी, और अंतिम पंक्ति पर खाली हो जाएगी।

10

यह आप जो देख रहे हैं उससे संपर्क कर सकते हैं और sed समाधान के रूप में महंगा नहीं होना चाहिए क्योंकि एडब्ल्यूके फ़ाइल में एक सूचक को बनाए रखता है getline खुलता है।

awk 'FNR == 1 { 
     getline nextline < FILENAME 
    } 
    { 
     getline nextline < FILENAME; 
     print "currentline is:", $0; 
     print "nextline is: ", nextline 
    }' input file 

पहला ब्लॉक पहली पंक्ति पढ़ता है और इसे बर्बाद करता है।

इस रूप में, getline किसी भी तरह के रूप में NR, FNR, NF या $0 चर निर्धारित नहीं करता है। यह केवल उस चर को सेट करता है जिसे आप आपूर्ति करते हैं (इस मामले में nextline)।

कुछ अतिरिक्त जानकारी के लिए this देखें।

+0

शर्म, यह प्रतीत होता है कि जीएनयू बहुत विशिष्ट है। – 0xC0000022L

+0

@ 0xC0000022L: यह मेरे लिए 'माक' के तहत काम करता है। –

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