BEGIN और END कमांड के साथ


13

Awk मैन्युअल के अनुसार, BEGIN और END का उपयोग इनपुट से मिलान करने के लिए नहीं किया जाता है, बल्कि जाग स्क्रिप्ट को स्टार्ट-अप और क्लीन-अप जानकारी प्रदान करने के लिए किया जाता है। यहाँ उदाहरण दिया गया है:

ls -l | \
awk 'BEGIN { print "Files found:\n" } /\<[a|x].*\.conf$/ { print $9 }'
Files found:
amd.conf
antivir.conf
xcdroast.conf
xinetd.conf

पहले यह एक स्ट्रिंग को आउटपुट में प्रिंट करता है। फिर यह एक पैटर्न मैच के लिए इनपुट की जांच करता है, जहां इनपुट किसी भी चरित्र के बाद या x के साथ शुरू होता है या कई बार .conf द्वारा पीछा किया जाता है। किसी भी मैच के लिए, 9 वां कॉलम छपा होता है।

तथ्य यह है कि हम यहां उपयोग करने के लिए मजबूर हैं, क्या इसका मतलब यह है कि awk केवल एक प्रिंट फ़ंक्शन पर उपयोग कर सकते हैं जिसमें एक BEGIN / END शामिल है? यदि नहीं, तो हम शुरुआत में बिना BEGIN कीवर्ड के प्रिंट फ़ंक्शन का उपयोग क्यों नहीं कर सकते हैं? ऐसा लगता है कि BEGIN बहुत ही शानदार है।


बिना BEGIN के केवल कमांड चलाने से आपके प्रश्न का उत्तर मिल जाएगा, यह दिखाते हुए कि यह अतिश्योक्तिपूर्ण नहीं है और आपको एक अलग परिणाम मिलेगा।
एमएसबी

जवाबों:


11

BEGINज़रूरत से ज़्यादा नहीं है। यदि आप निर्दिष्ट नहीं करते हैं, BEGINतो printइनपुट की प्रत्येक पंक्ति के लिए निष्पादित किया जाएगा।

मैनुअल से उद्धरण :

एक BEGINनियम को केवल एक बार निष्पादित किया जाता है, पहले इनपुट रिकॉर्ड को पढ़ने से पहले। इसी तरह, एक ENDनियम को केवल एक बार निष्पादित किया जाता है, सभी इनपुट पढ़ने के बाद।

$ seq 5 | awk 'BEGIN{print "Hello"}/4/{print}'   # Hello printed once
Hello
4
$ seq 5 | awk '{print "Hello"}/4/{print}'        # Hello printed for each line of input
Hello
Hello
Hello
Hello
4
Hello
$

7

awkबॉडी के अलावा और ब्लॉक्स में दिए गए एक्सप्रेशंस के लिए इनपुट की प्रत्येक लाइन को प्रोसेस करता है । इन और ब्लॉक के मामले में , केवल एक बार बयानों को संसाधित करेगा, इनपुट की प्रक्रिया शुरू होने से पहले और इनपुट के प्रसंस्करण के बाद क्रमशः किया गया है। ब्लॉक के बिना , न केवल आप हेडर जैसी एक बार की जानकारी को प्रिंट करने में सक्षम नहीं होंगे, आप शरीर के लिए आवश्यक कुछ चर को कुशलतापूर्वक आरंभ करने में सक्षम नहीं होंगे। इसके अलावा, FYI करें, एक प्रोग्राम में कई और ब्लॉक हो सकते हैं ।BEGINENDBEGINENDawkBEGINawkBEGINEND


2

awkप्रत्येक ब्लॉक को केवल तभी निष्पादित करता है जब पैटर्न मेल खाता है। खाली पैटर्न (बस ब्लॉक) हर लाइन से मेल खाता है। BEGINऔर ENDविशेष पैटर्न हैं जो फ़ाइल की शुरुआत और अंत से मेल खाते हैं ( क्षैतिज दिशा में ^और अर्थ के अनुरूप $)।

यदि आप फ़ाइल को पढ़ने से पहले कुछ निष्पादित करना चाहते हैं, तो उपयोग करें BEGIN। मसलन, काउंटर या किसी चीज का इनिशियलाइजेशन। ENDफिर परिणाम एकत्र कर सकता है।


0

दिए गए उदाहरण में, जो मुझे लगता है कि शैक्षणिक स्पष्टता के लिए सरलीकृत है, आप सही हैं कि यह शानदार है। आप उपयोग किए बिना एक ही परिणाम प्राप्त कर सकते हैं BEGIN

1 == NR            { print "Files found:\n" }
/\<[a|x].*\.conf$/ { print $9               }

प्रिंट स्टेटमेंट इनपुट की पहली लाइन के लिए विवश होने के बाद से वही परिणाम देगा।

कहा जा रहा है, BEGINऔर ENDब्लॉक अविश्वसनीय रूप से शक्तिशाली उपकरण हैं। जैसा कि अन्य समाधानों ने उल्लेख किया है, आप BEGINवैरिएबल या अन्य रूटीन को इनिशियलाइज़ करने के लिए ब्लॉक का उपयोग कर सकते हैं, जिसे केवल एक बार करने की आवश्यकता होती है, लेकिन इसका उपयोग Awk कमांड को चलाने के लिए भी किया जा सकता है जब कोई फाइल प्रोसेस नहीं होती है। एक सरल उदाहरण:

BEGIN { print sqrt(12/4) }

आप यहाँ किसी भी इनपुट को संसाधित किए बिना Awk में प्रोग्रामिंग का अधिक गंभीर उदाहरण देख सकते हैं ।

इसी तरह, ENDगणना गणना करने और सभी इनपुट को संक्षेप में प्रस्तुत करने के लिए बेहद उपयोगी है। यह (आमतौर पर) डेटा में पहले पढ़ने के बिना नहीं किया जा सकता है। संक्षेपण का एक सरल उदाहरण यहां पाया जा सकता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.