एडब्ल्यूके: Difference between revisions

From Vigyanwiki
mNo edit summary
mNo edit summary
Line 1: Line 1:
यह लेख प्रोग्रामिंग भाषा के बारे में है। अन्य उपयोगों के लिए, AWK (बहुविकल्पी) देखें ।
यह लेख प्रोग्रामिंग भाषा के बारे में है। अन्य उपयोगों के लिए, AWK (बहुविकल्पी) देखें ।


AWK (''awk'')<ref name=awkLC.DR/>एक [[डोमेन-विशिष्ट भाषा]] है जिसे टेक्स्ट प्रोसेसिंग के लिए डिज़ाइन किया गया है और आमतौर पर डेटा निष्कर्षण और रिपोर्टिंग टूल के रूप में उपयोग किया जाता है। [[sed]] और [[grep]] की तरह, यह एक [[फिल्टर (सॉफ्टवेयर)]] है,<ref name=awkLC.DR>{{cite magazine |magazine=Digital Review |date=May 2, 1988 |page=91 |author=James W. Livingston |title=ग्रेट ऑक प्रोग्राम नो बर्डब्रेन है}}</ref> और अधिकांश [[यूनिक्स जैसा ऑपरेटिंग सिस्टम]] की एक मानक विशेषता है।
एडब्ल्यूके (''awk'')<ref name=awkLC.DR/>एक [[डोमेन-विशिष्ट भाषा]] है जिसे पाठ प्रसंस्करण के लिए डिज़ाइन किया गया है और आमतौर पर डेटा निष्कर्षण और रिपोर्टिंग उपकरण के रूप में उपयोग किया जाता है। [[sed]] और [[grep]] की तरह,यह एक [[फिल्टर (सॉफ्टवेयर)]] है,<ref name=awkLC.DR>{{cite magazine |magazine=Digital Review |date=May 2, 1988 |page=91 |author=James W. Livingston |title=ग्रेट ऑक प्रोग्राम नो बर्डब्रेन है}}</ref> और अधिकांश [[यूनिक्स जैसा ऑपरेटिंग सिस्टम|यूनिक्स जैसे प्रचालन तंत्र]] की एक मानक विशेषता है।


AWK भाषा एक डेटा-चालित प्रोग्रामिंग है। डेटा-चालित स्क्रिप्टिंग भाषा जिसमें पाठ्य डेटा के [[स्ट्रीम (कंप्यूटिंग)]] के खिलाफ की जाने वाली क्रियाओं का एक सेट होता है - या तो सीधे फाइलों पर चलता है या एक [[पाइपलाइन (यूनिक्स)]] के हिस्से के रूप में उपयोग किया जाता है - के लिए टेक्स्ट निकालने या बदलने के उद्देश्य, जैसे स्वरूपित रिपोर्ट तैयार करना। भाषा बड़े पैमाने पर [[स्ट्रिंग (कंप्यूटर विज्ञान)]] [[डेटा प्रकार]], सहयोगी सरणी (यानी, कुंजी स्ट्रिंग्स द्वारा अनुक्रमित सरणी), और [[नियमित अभिव्यक्ति]]यों का उपयोग करती है। जबकि AWK का एक सीमित इरादा [[डोमेन (सॉफ्टवेयर इंजीनियरिंग)]] है और इसे विशेष रूप से [[एक-लाइनर कार्यक्रम]]ों का समर्थन करने के लिए डिज़ाइन किया गया था, भाषा [[ट्यूरिंग-पूर्ण]] है, और यहां तक ​​कि AWK के शुरुआती बेल लैब्स उपयोगकर्ता अक्सर अच्छी तरह से संरचित बड़े AWK प्रोग्राम लिखते थे।<ref>{{cite web
AWK भाषा एक डेटा-चालित स्क्रिप्टिंग भाषा है जिसमें पाठ्य डेटा की धाराओं के खिलाफ की जाने वाली क्रियाओं का एक सेट होता है -या तो सीधे फाइलों पर चलता है या एक [[पाइपलाइन (यूनिक्स)]] के हिस्से के रूप में उपयोग किया जाता है-के लिए टेक्स्ट निकालने या बदलने के उद्देश्य,जैसे स्वरूपित रिपोर्ट तैयार करना। भाषा बड़े पैमाने पर [[स्ट्रिंग (कंप्यूटर विज्ञान)|धाराओं (कंप्यूटर विज्ञान)]] [[डेटा प्रकार]],सहयोगी सरणी (यानी, कुंजी स्ट्रिंग्स द्वारा अनुक्रमित सरणी),और [[नियमित अभिव्यक्ति]]यों का उपयोग करती है। जबकि AWK का एक सीमित इरादा [[डोमेन (सॉफ्टवेयर इंजीनियरिंग)]] है और इसे विशेष रूप से [[एक-लाइनर कार्यक्रम|एक-लाइनर कार्यक्रमो]] का समर्थन करने के लिए डिज़ाइन किया गया था, भाषा [[ट्यूरिंग-पूर्ण]] है, और यहां तक ​​कि AWK के शुरुआती बेल लैब्स उपयोगकर्ता अक्सर अच्छी तरह से संरचित बड़े AWK प्रोग्राम लिखते थे।<ref>{{cite web
| url        = http://www.faqs.org/docs/artu/ch08s02.html#awk
| url        = http://www.faqs.org/docs/artu/ch08s02.html#awk
| title      = Applying Minilanguages
| title      = Applying Minilanguages

Revision as of 12:06, 14 December 2022

यह लेख प्रोग्रामिंग भाषा के बारे में है। अन्य उपयोगों के लिए, AWK (बहुविकल्पी) देखें ।

एडब्ल्यूके (awk)[1]एक डोमेन-विशिष्ट भाषा है जिसे पाठ प्रसंस्करण के लिए डिज़ाइन किया गया है और आमतौर पर डेटा निष्कर्षण और रिपोर्टिंग उपकरण के रूप में उपयोग किया जाता है। sed और grep की तरह,यह एक फिल्टर (सॉफ्टवेयर) है,[1] और अधिकांश यूनिक्स जैसे प्रचालन तंत्र की एक मानक विशेषता है।

AWK भाषा एक डेटा-चालित स्क्रिप्टिंग भाषा है जिसमें पाठ्य डेटा की धाराओं के खिलाफ की जाने वाली क्रियाओं का एक सेट होता है -या तो सीधे फाइलों पर चलता है या एक पाइपलाइन (यूनिक्स) के हिस्से के रूप में उपयोग किया जाता है-के लिए टेक्स्ट निकालने या बदलने के उद्देश्य,जैसे स्वरूपित रिपोर्ट तैयार करना। भाषा बड़े पैमाने पर धाराओं (कंप्यूटर विज्ञान) डेटा प्रकार,सहयोगी सरणी (यानी, कुंजी स्ट्रिंग्स द्वारा अनुक्रमित सरणी),और नियमित अभिव्यक्तियों का उपयोग करती है। जबकि AWK का एक सीमित इरादा डोमेन (सॉफ्टवेयर इंजीनियरिंग) है और इसे विशेष रूप से एक-लाइनर कार्यक्रमो का समर्थन करने के लिए डिज़ाइन किया गया था, भाषा ट्यूरिंग-पूर्ण है, और यहां तक ​​कि AWK के शुरुआती बेल लैब्स उपयोगकर्ता अक्सर अच्छी तरह से संरचित बड़े AWK प्रोग्राम लिखते थे।[2] AWK को 1970 के दशक में बेल लैब्स में बनाया गया था,[3] और इसका नाम इसके लेखकों के उपनामों से लिया गया है: मैं अल्फ्रेड हूं, पीटर जे। वेनबर्गर, और ब्रायन कर्निघन। परिवर्णी शब्द का उच्चारण पक्षी के अतिरिक्त के समान ही किया जाता है, जो AWK प्रोग्रामिंग लैंग्वेज के कवर पर है।[4] जब सभी छोटे अक्षरों में लिखा जाता है, जैसे awk, यह बेल लैब्स प्रोग्राम के यूनिक्स या प्लान 9 को संदर्भित करता है जो AWK प्रोग्रामिंग भाषा में लिखी गई स्क्रिप्ट को चलाता है।

इतिहास

AWK को शुरू में 1977 में अल्फ्रेड अहो (उदाहरण के लिए के लेखक), पीटर जे. वेनबर्गर (जिन्होंने छोटे रिलेशनल डेटाबेस पर काम किया था), और ब्रायन कर्निघन द्वारा विकसित किया गया था। AWK इसका नाम उनके संबंधित आद्याक्षर से लेता है। कर्निघन के अनुसार, एडब्ल्यूके के लक्ष्यों में से एक ऐसा उपकरण होना था जो आसानी से संख्याओं और तारों दोनों में हेरफेर कर सके। AWK मार्क रोचकिंड की प्रोग्रामिंग भाषा से भी प्रेरित था जिसका उपयोग इनपुट डेटा में पैटर्न खोजने के लिए किया गया था, और इसे yacc का उपयोग करके लागू किया गया था।[5] संस्करण 7 यूनिक्स में प्रकट होने वाले शुरुआती उपकरणों में से एक के रूप में, AWK ने बॉर्न शेल के अलावा एक यूनिक्स पाइपलाइन (यूनिक्स) में कम्प्यूटेशनल सुविधाएँ जोड़ीं, जो मानक यूनिक्स वातावरण में उपलब्ध एकमात्र स्क्रिप्टिंग भाषा है। यह एकल यूनिक्स विशिष्टता की अनिवार्य उपयोगिताओं में से एक है,[6] और Linux मानक आधार विनिर्देश द्वारा आवश्यक है।[7] AWK को 1985-88 में महत्वपूर्ण रूप से संशोधित और विस्तारित किया गया था, जिसके परिणामस्वरूप 1988 में पॉल रूबिन, जे फेनलसन और रिचर्ड स्टालमैन द्वारा लिखित Gawk (GNU पैकेज) कार्यान्वयन हुआ।[8]जीएनयू एडब्ल्यूके सबसे व्यापक रूप से तैनात संस्करण हो सकता है[9] क्योंकि यह GNU-आधारित Linux पैकेज में शामिल है। GNU AWK को 1994 से केवल अर्नोल्ड रॉबिंस द्वारा बनाए रखा गया है।[8] ब्रायन कर्निघन का नॉक (न्यू एडब्ल्यूके) स्रोत पहली बार 1993 में अप्रकाशित और 1990 के दशक के अंत से सार्वजनिक रूप से जारी किया गया था; कई बीएसडी सिस्टम जीपीएल लाइसेंस से बचने के लिए इसका इस्तेमाल करते हैं।[8]

AWK सेड (1974) से पहले था। दोनों को टेक्स्ट प्रोसेसिंग के लिए डिजाइन किया गया था। वे लाइन-उन्मुख, डेटा-संचालित प्रतिमान साझा करते हैं, और अंतर्निहित मुख्य लूप और वर्तमान लाइन चर के कारण एक-लाइनर प्रोग्राम लिखने के लिए विशेष रूप से उपयुक्त हैं। प्रारंभिक एडब्ल्यूके कार्यक्रमों की शक्ति और कठोरता - विशेष रूप से शक्तिशाली नियमित अभिव्यक्ति से निपटने और निहित चर के कारण संक्षिप्तता, जो एक-लाइनर्स की सुविधा प्रदान करते हैं - साथ में उस समय एडब्ल्यूके की सीमाएं, पर्ल भाषा (1987) के लिए महत्वपूर्ण प्रेरणा थीं। 1990 के दशक में, पर्ल बहुत लोकप्रिय हो गया, यूनिक्स पाठ-प्रसंस्करण भाषाओं के आला में AWK के साथ प्रतिस्पर्धा कर रहा था।

एडब्ल्यूके कार्यक्रमों की संरचना

फ़ाइल: POSIX awk.pdf

AWK reads the input a line at a time. A line is scanned for each pattern in the program, and for each pattern that matches, the associated action is executed.

— Alfred V. Aho[10]

AWK प्रोग्राम पैटर्न एक्शन जोड़े की एक श्रृंखला है, जिसे इस प्रकार लिखा गया है:

<वाक्यविन्यास लैंग = awk> स्थिति {क्रिया} स्थिति {क्रिया} ... </वाक्यविन्यास हाइलाइट>

जहां स्थिति आमतौर पर एक अभिव्यक्ति है और क्रिया आदेशों की एक श्रृंखला है। इनपुट को रिकॉर्ड में विभाजित किया जाता है, जहां डिफ़ॉल्ट रूप से रिकॉर्ड को न्यूलाइन वर्णों से अलग किया जाता है ताकि इनपुट को लाइनों में विभाजित किया जा सके। कार्यक्रम बदले में प्रत्येक स्थिति के विरुद्ध प्रत्येक रिकॉर्ड का परीक्षण करता है, और प्रत्येक सत्य अभिव्यक्ति के लिए क्रिया निष्पादित करता है। या तो शर्त या क्रिया को छोड़ा जा सकता है। शर्त हर रिकॉर्ड से मेल खाने के लिए डिफ़ॉल्ट है। रिकॉर्ड को प्रिंट करना डिफ़ॉल्ट क्रिया है। यह sed के समान पैटर्न-एक्शन स्ट्रक्चर है।

एक साधारण AWK एक्सप्रेशन के अलावा, जैसे foo == 1 या /^foo/स्थिति हो सकती है BEGIN या END सभी रिकॉर्ड पढ़ने से पहले या बाद में कार्रवाई को निष्पादित करने का कारण बनता है, या पैटर्न 1, पैटर्न 2 जो एक रिकॉर्ड से शुरू होने वाले रिकॉर्ड की श्रेणी से मेल खाता है जो पैटर्न 1 से मेल खाता है और उस रिकॉर्ड को शामिल करता है जो पैटर्न 2 से मेल खाता है और बाद में पैटर्न 1 के खिलाफ फिर से मिलान करने का प्रयास करता है। लाइनें।

सामान्य अंकगणितीय और तार्किक ऑपरेटरों के अलावा, एडब्ल्यूके एक्सप्रेशन में टिल्ड ऑपरेटर शामिल है, ~, जो एक स्ट्रिंग के खिलाफ एक नियमित अभिव्यक्ति से मेल खाता है। सुविधाजनक सिंटैक्टिक चीनी के रूप में, /regexp/ टिल्ड ऑपरेटर का उपयोग किए बिना वर्तमान रिकॉर्ड के खिलाफ मेल खाता है; यह सिंटैक्स sed से निकला है, जो बदले में इसे एड (टेक्स्ट एडिटर) संपादक से विरासत में मिला है, जहाँ / खोजने के लिए प्रयोग किया जाता है। नियमित अभिव्यक्ति के लिए सीमांकक के रूप में स्लैश का उपयोग करने का यह सिंटैक्स बाद में पर्ल और ईसीएमएस्क्रिप्ट द्वारा अपनाया गया था, और अब आम है। पर्ल द्वारा टिल्ड ऑपरेटर को भी अपनाया गया था।

आदेश

AWK कमांड वे कथन हैं जो उपरोक्त उदाहरणों में कार्रवाई के लिए प्रतिस्थापित किए गए हैं। AWK कमांड में फंक्शन कॉल, वेरिएबल असाइनमेंट, कैलकुलेशन, या कोई संयोजन शामिल हो सकता है। AWK में कई कार्यों के लिए अंतर्निहित समर्थन शामिल है; AWK के विभिन्न स्वादों द्वारा और भी बहुत कुछ प्रदान किया जाता है। साथ ही, कुछ स्वाद गतिशील रूप से लिंक की गई लाइब्रेरी को शामिल करने का समर्थन करते हैं, जो अधिक फ़ंक्शन भी प्रदान कर सकता है।

प्रिंट कमांड

प्रिंट कमांड का उपयोग टेक्स्ट को आउटपुट करने के लिए किया जाता है। आउटपुट टेक्स्ट हमेशा एक पूर्वनिर्धारित स्ट्रिंग के साथ समाप्त होता है जिसे आउटपुट रिकॉर्ड सेपरेटर (ओआरएस) कहा जाता है जिसका डिफ़ॉल्ट मान एक नई पंक्ति है। इस कमांड का सबसे सरल रूप है:

print
यह वर्तमान रिकॉर्ड की सामग्री प्रदर्शित करता है। AWK में, रिकॉर्ड्स को फ़ील्ड्स में तोड़ा जाता है, और इन्हें अलग से प्रदर्शित किया जा सकता है:
print $1
वर्तमान रिकॉर्ड का पहला क्षेत्र प्रदर्शित करता है
print $1, $3
वर्तमान रिकॉर्ड के पहले और तीसरे क्षेत्र को प्रदर्शित करता है, जिसे एक पूर्वनिर्धारित स्ट्रिंग द्वारा अलग किया जाता है जिसे आउटपुट फील्ड सेपरेटर (OFS) कहा जाता है, जिसका डिफ़ॉल्ट मान सिंगल स्पेस वर्ण है

हालांकि ये क्षेत्र ($X) चर के समान हो सकते हैं ($ प्रतीक पर्ल में चर को इंगित करता है), वे वास्तव में वर्तमान रिकॉर्ड के क्षेत्र को संदर्भित करते हैं। एक विशेष मामला, $0, पूरे रिकॉर्ड को संदर्भित करता है। वास्तव में, आदेशprintतथाprint $0कार्यक्षमता में समान हैं।

प्रिंट कमांड गणना और/या फ़ंक्शन कॉल के परिणाम भी प्रदर्शित कर सकता है: <वाक्यविन्यास लैंग = awk> /regex_pattern/ {

   # रिकॉर्ड (पंक्ति) उपरोक्त regex_pattern से मेल खाने की स्थिति में प्रदर्शन करने के लिए कार्य
   3+2 प्रिंट करें
   फ़ोबार प्रिंट करें(3)
   प्रिंट फोबार (चर)
   प्रिंट पाप (3-2)

} </वाक्यविन्यास हाइलाइट>

आउटपुट फ़ाइल में भेजा जा सकता है: <वाक्यविन्यास लैंग = awk> /regex_pattern/ {

   # रिकॉर्ड (पंक्ति) उपरोक्त regex_pattern से मेल खाने की स्थिति में प्रदर्शन करने के लिए कार्य
   प्रिंट अभिव्यक्ति> फ़ाइल का नाम

} </वाक्यविन्यास हाइलाइट>

या एक पाइप के माध्यम से (यूनिक्स): <वाक्यविन्यास लैंग = awk> /regex_pattern/ {

   # रिकॉर्ड (पंक्ति) उपरोक्त regex_pattern से मेल खाने की स्थिति में प्रदर्शन करने के लिए कार्य
   प्रिंट अभिव्यक्ति | आज्ञा

} </वाक्यविन्यास हाइलाइट>

अंतर्निहित चर

Awk के बिल्ट-इन वेरिएबल्स में फ़ील्ड वेरिएबल्स शामिल हैं: $1, $2, $3, और इसी तरह ($0 पूरे रिकॉर्ड का प्रतिनिधित्व करता है)। वे रिकॉर्ड में अलग-अलग टेक्स्ट-फ़ील्ड में टेक्स्ट या मान रखते हैं।

अन्य चर में शामिल हैं:

  • NR: अभिलेखों की संख्या। सभी डेटा फ़ाइलों से अब तक पढ़े गए इनपुट रिकॉर्ड की संख्या की वर्तमान गणना रखता है। यह शून्य से शुरू होता है, लेकिन कभी भी स्वचालित रूप से शून्य पर रीसेट नहीं होता है।[11]
  • FNR: रिकॉर्ड की फ़ाइल संख्या। वर्तमान फ़ाइल में अब तक पढ़े गए इनपुट रिकॉर्ड की संख्या की वर्तमान गणना रखता है। हर बार जब कोई नई फ़ाइल शुरू होती है तो यह चर स्वचालित रूप से शून्य पर रीसेट हो जाता है।[11]* NF: क्षेत्रों की संख्या। वर्तमान इनपुट रिकॉर्ड में फ़ील्ड की संख्या शामिल है। इनपुट रिकॉर्ड में अंतिम फ़ील्ड को $NF, दूसरे से अंतिम फ़ील्ड को $(NF-1), तीसरे से अंतिम फ़ील्ड को $(NF-2), आदि द्वारा निर्दिष्ट किया जा सकता है।
  • FILENAME: वर्तमान इनपुट-फ़ाइल का नाम समाहित करता है।
  • FS: क्षेत्र विभाजक। इनपुट रिकॉर्ड में फ़ील्ड को विभाजित करने के लिए उपयोग किए जाने वाले फ़ील्ड विभाजक शामिल हैं। डिफ़ॉल्ट, सफेद स्थान, स्थान और टैब वर्णों के किसी भी क्रम की अनुमति देता है। फ़ील्ड विभाजक को बदलने के लिए FS को किसी अन्य वर्ण या वर्ण अनुक्रम के साथ पुन: असाइन किया जा सकता है।
  • RS: रिकॉर्ड विभाजक। वर्तमान रिकॉर्ड विभाजक चरित्र को संग्रहीत करता है। चूंकि, डिफ़ॉल्ट रूप से, एक इनपुट लाइन इनपुट रिकॉर्ड है, डिफ़ॉल्ट रिकॉर्ड विभाजक वर्ण एक नई पंक्ति है।
  • OFS: आउटपुट फील्ड सेपरेटर। आउटपुट फ़ील्ड विभाजक को संग्रहीत करता है, जो फ़ील्ड को तब अलग करता है जब Awk उन्हें प्रिंट करता है। डिफ़ॉल्ट एक अंतरिक्ष वर्ण है।
  • ORS: आउटपुट रिकॉर्ड विभाजक। आउटपुट रिकॉर्ड विभाजक को संग्रहीत करता है, जो आउटपुट रिकॉर्ड को तब अलग करता है जब Awk उन्हें प्रिंट करता है। डिफ़ॉल्ट एक न्यूलाइन कैरेक्टर है।
  • OFMT: आउटपुट स्वरूप। न्यूमेरिक आउटपुट के लिए फॉर्मेट को स्टोर करता है। डिफ़ॉल्ट स्वरूप %.6g है।

चर और वाक्य रचना

वेरिएबल नाम किसी भी अक्षर [A-Za-z0-9_] का उपयोग कर सकते हैं, भाषा कीवर्ड के अपवाद के साथ। ऑपरेटर्स + - * / क्रमशः जोड़, घटाव, गुणा और भाग का प्रतिनिधित्व करते हैं। स्ट्रिंग संघनन के लिए, बस दो चर (या स्ट्रिंग स्थिरांक) एक दूसरे के बगल में रखें। यदि स्ट्रिंग स्थिरांक शामिल हैं, तो बीच में एक स्थान का उपयोग करना वैकल्पिक है, लेकिन एक दूसरे से सटे हुए दो चर नामों के बीच में एक स्थान की आवश्यकता होती है। दोहरे उद्धरण स्ट्रिंग स्थिरांक का परिसीमन करते हैं। बयानों को अर्धविरामों के साथ समाप्त करने की आवश्यकता नहीं है। अंत में, एक पंक्ति पर पहले वर्ण के रूप में # का उपयोग करके कार्यक्रमों में टिप्पणियां जोड़ी जा सकती हैं।

उपयोगकर्ता परिभाषित कार्य

सी (प्रोग्रामिंग भाषा) के समान प्रारूप में, फ़ंक्शन परिभाषाओं में कीवर्ड शामिल होता है function, फ़ंक्शन नाम, तर्क नाम और फ़ंक्शन बॉडी। यहाँ एक फ़ंक्शन का उदाहरण दिया गया है। <वाक्यविन्यास लैंग = awk> समारोह add_three (संख्या) {

   वापसी संख्या + 3

} </वाक्यविन्यास हाइलाइट>

इस कथन को निम्नानुसार लागू किया जा सकता है: <वाक्यविन्यास लैंग = awk> (नमूना) {

  प्रिंट ऐड_थ्री (36) # आउटपुट 39

} </वाक्यविन्यास हाइलाइट>

फ़ंक्शंस में वेरिएबल्स हो सकते हैं जो स्थानीय दायरे में हैं। इनके नाम तर्क सूची के अंत में जोड़े जाते हैं, हालांकि फ़ंक्शन को कॉल करते समय इनके लिए मान छोड़े जाने चाहिए। स्थानीय वेरिएबल्स से पहले तर्क सूची में कुछ व्हाइटस्पेस चरित्र जोड़ने के लिए यह परंपरा है, यह इंगित करने के लिए कि पैरामीटर कहां समाप्त होते हैं और स्थानीय चर शुरू होते हैं।

उदाहरण

हैलो वर्ल्ड

यहाँ प्रथागत हैलो, वर्ल्ड है! प्रोग्राम|हैलो, विश्व कार्यक्रम AWK में लिखा गया है: <वाक्यविन्यास लैंग = awk> शुरू करना {

       प्रिंट हैलो, दुनिया!
       बाहर निकलना

} </वाक्यविन्यास हाइलाइट>

=== 80 वर्णों से अधिक लंबी लाइनें === प्रिंट करें

80 वर्णों से अधिक लंबी सभी पंक्तियों को प्रिंट करें। ध्यान दें कि डिफ़ॉल्ट क्रिया वर्तमान लाइन को प्रिंट करना है। <वाक्यविन्यास लैंग = awk> लंबाई($0) > 80 </वाक्यविन्यास हाइलाइट>

शब्द गिनें

इनपुट में शब्दों की गणना करें और पंक्तियों, शब्दों और वर्णों की संख्या प्रिंट करें (जैसे wc (यूनिक्स)): <वाक्यविन्यास लैंग = awk> {

   शब्द + = एनएफ
   वर्ण + = लंबाई + 1 # प्रत्येक रिकॉर्ड (पंक्ति) के अंत में न्यूलाइन वर्ण के लिए खाते में एक जोड़ें

} END {प्रिंट एनआर, शब्द, वर्ण} </वाक्यविन्यास हाइलाइट>

चूंकि कार्यक्रम की पहली पंक्ति के लिए कोई पैटर्न नहीं है, इनपुट की प्रत्येक पंक्ति डिफ़ॉल्ट रूप से मेल खाती है, इसलिए प्रत्येक पंक्ति के लिए वृद्धि क्रियाएं निष्पादित की जाती हैं। ध्यान दें कि words += NF के लिए आशुलिपि है words = words + NF.

योग अंतिम शब्द

<वाक्यविन्यास लैंग = awk> {एस + = $ एनएफ} अंत {प्रिंट एस + 0} </वाक्यविन्यास हाइलाइट>

s को $NF के सांख्यिक मान से बढ़ाया जाता है, जो AWK के क्षेत्र विभाजक (डिफ़ॉल्ट रूप से, व्हाइट-स्पेस) द्वारा परिभाषित रेखा पर अंतिम शब्द है। एनएफ वर्तमान पंक्ति में फ़ील्ड की संख्या है, उदा। 4. चूँकि $4 चौथे क्षेत्र का मान है, $NF पंक्ति में अंतिम क्षेत्र का मान है, इस बात की परवाह किए बिना कि इस रेखा में कितने क्षेत्र हैं, या इसमें आस-पास की रेखाओं की तुलना में अधिक या कम क्षेत्र हैं। $ वास्तव में उच्चतम ऑपरेटर प्राथमिकता वाला एक यूनरी ऑपरेटर है। (यदि लाइन में कोई फ़ील्ड नहीं है, तो NF 0 है, $0 पूरी लाइन है, जो इस मामले में संभावित व्हाइट-स्पेस के अलावा खाली है, और इसलिए इसका संख्यात्मक मान 0 है।)

इनपुट के अंत में END पैटर्न मेल खाता है, इसलिए s प्रिंट किया जाता है। हालाँकि, चूंकि इनपुट की कोई पंक्ति नहीं हो सकती है, जिस स्थिति में कभी भी कोई मान निर्दिष्ट नहीं किया गया है, यह डिफ़ॉल्ट रूप से एक खाली स्ट्रिंग होगा। एक चर में शून्य जोड़ना एक AWK मुहावरा है जो इसे एक स्ट्रिंग से संख्यात्मक मान तक ले जाने के लिए मजबूर करता है। (एक खाली स्ट्रिंग को जोड़ना एक संख्या से एक स्ट्रिंग के लिए ज़बरदस्ती करना है, उदाहरण के लिए s । ध्यान दें, स्ट्रिंग्स को जोड़ने के लिए कोई ऑपरेटर नहीं है, वे बस बगल में रखे गए हैं।) ज़बरदस्ती के साथ प्रोग्राम एक खाली इनपुट पर 0 प्रिंट करता है, इसके बिना, एक खाली लाइन छपी है।

इनपुट लाइनों की एक श्रृंखला का मिलान करें

<वाक्यविन्यास लैंग = awk> एनआर% 4 == 1, एनआर% 4 == 3 {printf% 6d% s\n, एनआर, $0} </वाक्यविन्यास हाइलाइट> एक्शन स्टेटमेंट प्रत्येक पंक्ति क्रमांकित प्रिंट करता है। Printf फ़ंक्शन मानक C Printf का अनुकरण करता है और ऊपर वर्णित प्रिंट कमांड के समान कार्य करता है। मिलान करने के लिए पैटर्न, हालांकि, निम्नानुसार काम करता है: एनआर रिकॉर्ड्स की संख्या है, आम तौर पर इनपुट की पंक्तियां, एडब्ल्यूके ने अब तक पढ़ा है, यानी इनपुट की पहली पंक्ति के लिए 1 से शुरू होने वाली वर्तमान पंक्ति संख्या। % मॉड्यूल ऑपरेशन ऑपरेटर है। एनआर% 4 == 1 पहली, 5वीं, 9वीं, आदि, इनपुट की पंक्तियों के लिए सत्य है। इसी प्रकार, एनआर% 4 == 3 इनपुट की तीसरी, 7वीं, 11वीं, आदि के लिए सही है। रेंज पैटर्न तब तक झूठा है जब तक कि पहला भाग लाइन 1 पर मेल नहीं खाता है, और तब तक सही रहता है और जब दूसरा भाग मेल खाता है, तब तक लाइन 3 पर होता है। यह तब तक झूठा रहता है जब तक कि पहला भाग लाइन 5 पर फिर से मेल नहीं खाता।

इस प्रकार, प्रोग्राम 1,2,3 पंक्तियों को प्रिंट करता है, रेखा 4 को छोड़ देता है, और फिर 5,6,7, और इसी तरह। प्रत्येक पंक्ति के लिए, यह पंक्ति संख्या (6 वर्ण-चौड़े फ़ील्ड पर) और फिर पंक्ति सामग्री को प्रिंट करता है। उदाहरण के लिए, जब इस इनपुट पर निष्पादित किया जाता है:

रोम
फ़्लोरेंस
मिलन
नेपल्स
ट्यूरिन
वेनिस

पिछला कार्यक्रम प्रिंट करता है:

     1 रोम
     2 फ्लोरेंस
     3 मिलान
     5 ट्यूरिन
     6 वेनिस

फ़ाइल के प्रारंभिक या अंतिम भाग को प्रिंट करना

एक विशेष मामले के रूप में, जब रेंज पैटर्न का पहला भाग लगातार सत्य होता है, उदा। 1, रेंज इनपुट की शुरुआत में शुरू होगी। इसी तरह, यदि दूसरा भाग लगातार असत्य है, उदा. 0, इनपुट के अंत तक सीमा जारी रहेगी। उदाहरण के लिए, <वाक्यविन्यास लैंग = awk>

/^--यहां काटें--$/, 0

</वाक्यविन्यास हाइलाइट> रेगुलर एक्सप्रेशन ^--कट हियर--$ से मेल खाने वाली पहली लाइन से इनपुट की लाइन प्रिंट करता है, यानी एक लाइन जिसमें केवल वाक्यांश --कट हियर-- होता है, अंत तक।

शब्द आवृत्तियों की गणना करें

साहचर्य सरणियों का उपयोग करते हुए शब्द आवृत्ति: <वाक्यविन्यास लैंग = awk> शुरू करना {

   एफएस = [^ए-जेडए-जेड]+

} {

   के लिए (i=1; i<=NF; i++)
       शब्द [tolower($i)]++

} समाप्त {

   के लिए (मैं शब्दों में)
       प्रिंट मैं, शब्द [i]

} </वाक्यविन्यास हाइलाइट>

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

के लिए (मैं शब्दों में)

एक लूप बनाता है जो सरणी शब्दों के माध्यम से जाता है, i को सरणी के प्रत्येक सबस्क्रिप्ट पर सेट करता है। यह अधिकांश भाषाओं से अलग है, जहां ऐसा लूप सरणी में प्रत्येक मान से होकर जाता है। लूप इस प्रकार प्रत्येक शब्द को उसकी आवृत्ति गणना के बाद प्रिंट करता है। tolower पुस्तक प्रकाशित होने के बाद किए गए वन ट्रू ऑक (नीचे देखें) में एक अतिरिक्त था।

=== कमांड लाइन === से मैच पैटर्न

इस कार्यक्रम को कई तरह से दर्शाया जा सकता है। पहले वाला शेल स्क्रिप्ट बनाने के लिए बॉर्न शेल का उपयोग करता है जो सब कुछ करता है। यह इन विधियों में सबसे छोटा है: <वाक्यविन्यास लैंग = बैश>

  1. !/बिन/श

पैटर्न = $1 खिसक जाना awk '/' $pattern '/ { Print FILENAME : $0 }' $@ </वाक्यविन्यास हाइलाइट> $pattern e> awk कमांड में सिंगल कोट्स द्वारा संरक्षित नहीं है ताकि शेल वेरिएबल का विस्तार करे लेकिन रिक्त स्थान वाले पैटर्न को ठीक से संभालने के लिए इसे डबल कोट्स में डालने की आवश्यकता है। सामान्य तरीके से एक पैटर्न यह देखने के लिए जांच करता है कि क्या पूरी लाइन ($0) मेल खाता है। FILENAME वर्तमान फ़ाइल नाम शामिल है। awk का कोई स्पष्ट संयोजन संचालिका नहीं है; दो निकटवर्ती तार उन्हें जोड़ते हैं। $0 मूल अपरिवर्तित इनपुट लाइन तक फैलता है।

इसे लिखने के वैकल्पिक तरीके हैं। यह शेल स्क्रिप्ट पर्यावरण को सीधे awk के भीतर से एक्सेस करती है: <वाक्यविन्यास लैंग = बैश>

  1. !/बिन/श

निर्यात पैटर्न = $1 खिसक जाना awk '$0 ~ ENVIRON[ pattern ] { Print FILENAME : $0 }' $@ </वाक्यविन्यास हाइलाइट>

यह एक शेल स्क्रिप्ट है जो उपयोग करती है ENVIRON, पुस्तक प्रकाशित होने के बाद One True awk के एक नए संस्करण में प्रस्तुत की गई एक सरणी। का सबस्क्रिप्ट ENVIRON एक पर्यावरण चर का नाम है; इसका परिणाम चर का मान है। यह विभिन्न मानक पुस्तकालयों और पॉज़िक्स में getenv फ़ंक्शन की तरह है। शेल स्क्रिप्ट एक पर्यावरण चर बनाती है pattern पहला तर्क शामिल है, फिर वह तर्क छोड़ देता है और प्रत्येक फ़ाइल में पैटर्न के लिए अजीब दिखता है।

~ यह देखने के लिए जाँच करता है कि क्या उसका बायाँ ऑपरेंड उसके दाएँ ऑपरेंड से मेल खाता है; !~ इसका उलटा है। ध्यान दें कि रेगुलर एक्सप्रेशन केवल एक स्ट्रिंग है और इसे वेरिएबल्स में संग्रहीत किया जा सकता है।

अगला तरीका कमांड-लाइन वेरिएबल असाइनमेंट का उपयोग करता है, जिसमें awk के तर्क को एक वेरिएबल के असाइनमेंट के रूप में देखा जा सकता है: <वाक्यविन्यास लैंग = बैश>

  1. !/बिन/श

पैटर्न = $1 खिसक जाना awk '$0 ~ पैटर्न { Print FILENAME : $0 }' pattern=$pattern $@ </वाक्यविन्यास हाइलाइट>

या आप -v var=value कमांड लाइन विकल्प (जैसे awk -v pattern= $pattern ...) का उपयोग कर सकते हैं।

अंत में, यह शुद्ध awk में लिखा गया है, बिना शेल की मदद के या awk स्क्रिप्ट के कार्यान्वयन के बारे में बहुत अधिक जानने की आवश्यकता के बिना (जैसा कि कमांड लाइन पर चर असाइनमेंट करता है), लेकिन थोड़ा लंबा है: <वाक्यविन्यास लैंग = awk> शुरू करना {

   पैटर्न = एआरजीवी [1]
   for (i = 1; i <ARGC; i++) # पहले तर्क को हटा दें
       एआरजीवी [i] = एआरजीवी [i + 1]
   एआरजीसी--
   अगर (एआरजीसी == 1) {# पैटर्न ही एकमात्र चीज थी, इसलिए मानक इनपुट से बल पढ़ें (पुस्तक द्वारा प्रयुक्त)
       एआरजीसी = 2
       एआरजीवी [1] = -
   }

} $0 ~ पैटर्न { Print FILENAME : $0 } </वाक्यविन्यास हाइलाइट> BEGIN e> न केवल पहले तर्क को निकालने के लिए आवश्यक है, बल्कि इसे बाद में फ़ाइल नाम के रूप में व्याख्या किए जाने से रोकने के लिए भी आवश्यक है BEGIN ब्लॉक समाप्त होता है। ARGC, तर्कों की संख्या, हमेशा ≥1 होने की गारंटी है, जैसा कि ARGV[0] कमांड का नाम है जो स्क्रिप्ट को निष्पादित करता है, अक्सर स्ट्रिंग "awk". यह भी ध्यान दें ARGV[ARGC] खाली स्ट्रिंग है, "". # एक टिप्पणी आरंभ करता है जो पंक्ति के अंत तक विस्तृत होती है।

ध्यान दें if खंड मैथा। awk केवल यह देखने के लिए जाँच करता है कि कमांड चलाने से पहले उसे मानक इनपुट से पढ़ना चाहिए या नहीं। इस का मतलब है कि

अजीब 'ठेला'

केवल इसलिए काम करता है क्योंकि तथ्य यह है कि कोई फ़ाइल नाम नहीं है, केवल पहले चेक किया गया है prog चलाया जाता है! यदि आप स्पष्ट रूप से सेट करते हैं ARGC से 1 ताकि कोई तर्क न हो, अजीब बस छोड़ देगा क्योंकि ऐसा लगता है कि कोई और इनपुट फाइल नहीं है। इसलिए, आपको विशेष फ़ाइल नाम के साथ मानक इनपुट से पढ़ने के लिए स्पष्ट रूप से कहने की आवश्यकता है -.

स्व-निहित AWK स्क्रिप्ट्स

यूनिक्स जैसे ऑपरेटिंग सिस्टम पर शेबंग (यूनिक्स) सिंटैक्स का उपयोग करके स्व-निहित AWK स्क्रिप्ट का निर्माण किया जा सकता है।

उदाहरण के लिए, एक स्क्रिप्ट जो किसी फ़ाइल की सामग्री को प्रिंट करती है, नाम की फ़ाइल बनाकर बनाई जा सकती है print.awk निम्नलिखित सामग्री के साथ: <वाक्यविन्यास लैंग = awk>

  1. !/usr/bin/awk -f

{प्रिंट $0} </वाक्यविन्यास हाइलाइट>

इसके साथ आह्वान किया जा सकता है: ./print.awk <filename>

-f e> AWK को बताता है कि AWK प्रोग्राम को पढ़ने के लिए जो तर्क दिया गया है, वह फ़ाइल है, जो कि वही ध्वज है जिसका उपयोग sed में किया जाता है। चूंकि वे अक्सर वन-लाइनर्स के लिए उपयोग किए जाते हैं, ये दोनों प्रोग्राम एक अलग फाइल के बजाय कमांड-लाइन तर्क के रूप में दिए गए प्रोग्राम को निष्पादित करने के लिए डिफ़ॉल्ट होते हैं।

संस्करण और कार्यान्वयन

AWK मूल रूप से 1977 में लिखा गया था और संस्करण 7 यूनिक्स के साथ वितरित किया गया था।

1985 में इसके लेखकों ने भाषा का विस्तार करना शुरू किया, सबसे महत्वपूर्ण रूप से उपयोगकर्ता परिभाषित कार्यों को जोड़कर। 1988 में प्रकाशित पुस्तक द एडब्ल्यूके प्रोग्रामिंग लैंग्वेज में भाषा का वर्णन किया गया है, और इसका कार्यान्वयन यूनिक्स प्रणाली वीी के रिलीज में उपलब्ध कराया गया था। असंगत पुराने संस्करण के साथ भ्रम से बचने के लिए, इस संस्करण को कभी-कभी नया अजीब या नॉक कहा जाता था। यह कार्यान्वयन 1996 में एक मुफ्त सॉफ्टवेयर लाइसेंस के तहत जारी किया गया था और अभी भी ब्रायन कर्निघन द्वारा बनाए रखा गया है (नीचे बाहरी लिंक देखें)।[citation needed] यूनिक्स के पुराने संस्करण, जैसे यूनिक्स/32वी, शामिल हैं awkcc, जिसने AWK को C में बदल दिया। कर्निघन ने awk को C++ में बदलने के लिए एक प्रोग्राम लिखा; इसकी स्थिति ज्ञात नहीं है।[12]

  • BWK awk, जिसे nawk के नाम से भी जाना जाता है, ब्रायन कर्निघन के संस्करण को संदर्भित करता है। मूल रूप से भाषा का वर्णन करने वाली पुस्तक के साथ इस शब्द के उपयोग के कारण इसे वन ट्रू AWK करार दिया गया है और तथ्य यह है कि कर्निघन AWK के मूल लेखकों में से एक थे।[4] FreeBSD इस संस्करण को one-true-awk के रूप में संदर्भित करता है।[13] इस संस्करण में ऐसी विशेषताएं भी हैं जो पुस्तक में नहीं हैं, जैसे tolower तथा ENVIRON जिनकी व्याख्या ऊपर की गई है; विवरण के लिए स्रोत संग्रह में FIXES फ़ाइल देखें। इस संस्करण का उपयोग, उदाहरण के लिए, Android (ऑपरेटिंग सिस्टम), FreeBSD, NetBSD, OpenBSD, macOS, और इलुमोस द्वारा किया जाता है। ब्रायन कर्निघन और अर्नोल्ड रॉबिंस, नॉक के लिए स्रोत रिपॉजिटरी में मुख्य योगदानकर्ता हैं: github.com/onetrueawk/awk.
  • gawk (GNU awk) एक और फ्री-सॉफ्टवेयर कार्यान्वयन है और एकमात्र कार्यान्वयन है जो अंतर्राष्ट्रीयकरण और स्थानीयकरण और TCP/IP नेटवर्किंग को लागू करने में गंभीर प्रगति करता है। यह मूल कार्यान्वयन के स्वतंत्र रूप से उपलब्ध होने से पहले लिखा गया था। इसमें अपना स्वयं का डिबगर शामिल है, और इसकी प्रोफाइलिंग (कंप्यूटर प्रोग्रामिंग) उपयोगकर्ता को एक स्क्रिप्ट के लिए मापित प्रदर्शन संवर्द्धन करने में सक्षम बनाती है। यह उपयोगकर्ता को साझा पुस्तकालयों के साथ कार्यक्षमता बढ़ाने में भी सक्षम बनाता है। कुछ Linux वितरणों में उनके डिफ़ॉल्ट AWK कार्यान्वयन के रूप में गौक शामिल है।[citation needed]
  • mawk माइक ब्रेनन द्वारा बाईटकोड दुभाषिया पर आधारित एक बहुत तेज़ AWK कार्यान्वयन है।
  • libmawk mawk का एक फोर्क है, जो एप्लिकेशन को awk दुभाषियों के कई समानांतर उदाहरणों को एम्बेड करने की अनुमति देता है।
  • awka (जिसका फ्रंट एंड mawk प्रोग्राम के ऊपर लिखा हुआ है) C कोड में AWK स्क्रिप्ट्स का एक और ट्रांसलेटर है। जब संकलित किया जाता है, लेखक के libawka.a सहित सांख्यिकीय रूप से, परिणामी निष्पादनयोग्य काफी तेज हो जाते हैं और लेखक के परीक्षणों के अनुसार, AWK, पर्ल, या Tcl के अन्य संस्करणों के साथ बहुत अच्छी तरह से तुलना करते हैं। छोटी स्क्रिप्ट 160–170 kB के प्रोग्राम में बदल जाएँगी।
  • tawk (थॉम्पसन AWK) Solaris (ऑपरेटिंग सिस्टम), DOS, OS/2, और Microsoft Windows के लिए एक AWK संकलक है, जो पहले थॉम्पसन ऑटोमेशन सॉफ्टवेयर द्वारा बेचा जाता था (जिसने अपनी गतिविधियाँ बंद कर दी हैं)।[15]
  • Jawk Java (प्रोग्रामिंग लैंग्वेज) में AWK को लागू करने की एक परियोजना है, जिसे SourceForge पर होस्ट किया गया है।[16] AWK स्क्रिप्ट्स (यानी, जावा थ्रेड्स, सॉकेट्स, संग्रह, आदि) के भीतर जावा सुविधाओं तक पहुंच प्रदान करने के लिए भाषा में एक्सटेंशन जोड़े गए हैं।
  • xgawk gawk का एक कांटा है[17] जो गतिशील रूप से लोड करने योग्य पुस्तकालयों के साथ गॉक का विस्तार करता है। XMLgawk एक्सटेंशन को आधिकारिक GNU Awk रिलीज़ 4.1.0 में एकीकृत किया गया था।
  • 'QSEAWK' QSE लाइब्रेरी में शामिल एक एम्बेडेड AWK दुभाषिया कार्यान्वयन है जो C (प्रोग्रामिंग भाषा) और C++ के लिए एम्बेडिंग अप्लिकेशन प्रोग्रामिंग अंतरफलक (API) प्रदान करता है।[18]
  • libfawk सी में लिखा गया एक बहुत छोटा, केवल-फ़ंक्शन, रीएन्ट्रेंट, एम्बेड करने योग्य दुभाषिया है
  • बिजीबॉ