एडब्ल्यूके

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

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

एडब्ल्यूके को 1970 के दशक में बेल लैब्स में बनाया गया था, और इसका नाम इसके लेखकों के उपनामों से लिया गया है: मैं अल्फ्रेड हूं, पीटर जे वेनबर्गर और ब्रायन कर्निघन। परिवर्णी शब्द का उच्चारण पक्षी औक (auk) के नाम के समान ही किया जाता है, जो एडब्ल्यूके प्रोग्रामिंग भाषा के कवर पर है।  जब सभी छोटे अक्षरों में लिखा जाता है, जैसे  ,यह बेल लैब्स प्रोग्राम के यूनिक्स या परियोजना 9 को संदर्भित करता है जो एडब्ल्यूके प्रोग्रामिंग भाषा में लिखी गई पटकथा को चलाता है।

इतिहास
एडब्ल्यूके को शुरू में 1977 में अल्फ्रेड अहो(A),पीटर जे. वेनबर्गर(W),और ब्रायन कर्निघन(K )द्वारा विकसित किया गया था। एडब्ल्यूके नाम इसके लेखकों के उपनाम के पहले अक्षर से लिया गया है। कर्निघन के अनुसार,एडब्ल्यूके के लक्ष्यों में से एक ऐसा उपकरण होना था जो आसानी से संख्याओं और श्रृंखलाओं दोनों में कुशलता से काम कर सके। एडब्ल्यूके मार्क रोचकिंड की प्रोग्रामिंग भाषा से भी प्रेरित था जिसका उपयोग निविष्ट(इनपुट) जानकारी में प्रतिरूप खोजने के लिए किया गया था,और इसे yacc का उपयोग करके लागू किया गया था।

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

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

एडब्ल्यूके कार्यक्रमों की संरचना
एडब्ल्यूके निविष्ट को एक बार में एक पंक्ति में पढ़ता है। कार्यक्रम में प्रत्येक प्रतिरूप के लिए एक पंक्ति जांची जाती है,और प्रत्येक प्रतिरूप के लिए मिलान किया जाता है, और संबंधित क्रिया निष्पादित की जाती है।

-  -

एडब्ल्यूके प्रोग्राम प्रतिरूप गतिविधि जोड़े की एक श्रृंखला है, जिसे इस प्रकार लिखा गया है: condition { action } condition { action } ...

....

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

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

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

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

प्रिंट आदेश
प्रिंट आदेश का उपयोग लिखित सामग्री को उत्पादन करने के लिए किया जाता है। उत्पादित लिखित सामग्री हमेशा एक पूर्वनिर्धारित श्रृंखला के साथ समाप्त होता है जिसे श्रृंखला अभिलेख विभाजक (ओआरएस) कहा जाता है जिसका पूर्वनिर्धारित मान एक नई पंक्ति है। इस आदेश का सबसे सरल रूप है:


 * यह मौजूदा अभिलेख की सामग्री प्रदर्शित करता है। एडब्ल्यूके में,अभिलेख को क्षेत्रों में तोड़ा जाता है,और इन्हें अलग से प्रदर्शित किया जा सकता है:
 * यह मौजूदा अभिलेख की सामग्री प्रदर्शित करता है। एडब्ल्यूके में,अभिलेख को क्षेत्रों में तोड़ा जाता है,और इन्हें अलग से प्रदर्शित किया जा सकता है:


 * मौजूदा अभिलेख का पहला क्षेत्र प्रदर्शित करता है
 * मौजूदा अभिलेख का पहला क्षेत्र प्रदर्शित करता है


 * मौजूदा अभिलेख के पहले और तीसरे क्षेत्र को प्रदर्शित करता है, जिसे एक पूर्वनिर्धारित श्रृंखला द्वारा अलग किया जाता है जिसे उत्पादन क्षेत्र विभाजक (OFS) कहा जाता है, जिसका पूर्वनिर्धारित मान एक अन्तर वर्ण है।
 * मौजूदा अभिलेख के पहले और तीसरे क्षेत्र को प्रदर्शित करता है, जिसे एक पूर्वनिर्धारित श्रृंखला द्वारा अलग किया जाता है जिसे उत्पादन क्षेत्र विभाजक (OFS) कहा जाता है, जिसका पूर्वनिर्धारित मान एक अन्तर वर्ण है।

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

प्रिंट आदेश गणना और/या कार्य आह्वान के परिणाम भी प्रदर्शित कर सकता है: /regex_pattern/ { # Actions to perform in the event the record (line) matches the above regex_pattern print 3+2 print foobar(3) print foobar(variable) print sin(3-2) } निविष्ट फाइल मे भेजा जा सकता है: /regex_pattern/ { # Actions to perform in the event the record (line) matches the above regex_pattern print "expression" > "file name" } या पाइप के माध्यम से /regex_pattern/ { # Actions to perform in the event the record (line) matches the above regex_pattern print "expression" | "command" }

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

अन्य चर में शामिल हैं:
 * : अभिलेखों की संख्या। सभी डेटा फ़ाइलों से अब तक पढ़े गए निविष्ट अभिलेख की संख्या की मौजूदा गणना रखता है। यह शून्य से शुरू होता है, लेकिन कभी भी स्वचालित रूप से शून्य पर फिर से स्थापित नहीं होता है।
 * : अभिलेख की फ़ाइल संख्या। मौजूदा फ़ाइल में अब तक पढ़े गए निविष्ट अभिलेख की संख्या की तत्काल गणना रखता है। हर बार जब कोई नई फ़ाइल शुरू होती है तो यह चर स्वचालित रूप से शून्य पर फिर से स्थापित हो जाता है। * : क्षेत्रों की संख्या। मौजूदा निविष्ट अभिलेख में क्षेत्र की संख्या शामिल है।  निविष्ट अभिलेख में अंतिम क्षेत्र  को $NF, दूसरे से अंतिम क्षेत्र  को $(NF-1), तीसरे से अंतिम क्षेत्र को $(NF-2), आदि द्वारा निर्दिष्ट किया जा सकता है।
 * : मौजूदा निविष्ट-फ़ाइल का नाम समाहित करता है।
 * : क्षेत्र विभाजक। निविष्ट अभिलेखमें क्षेत्र को विभाजित करने के लिए उपयोग किए जाने वाले क्षेत्र विभाजक शामिल हैं। पूर्वस्थापित,श्वेत स्थान और टैब वर्णों के किसी भी क्रम की अनुमति देता है। क्षेत्र विभाजक को बदलने के लिए FS को किसी अन्य वर्ण या वर्ण अनुक्रम के साथ पुन: सौंपा जा सकता है।
 * :अभिलेख विभाजक। मौजूदा अभिलेख विभाजक चरित्र को संग्रहीत करता है। चूंकि, पूर्वस्थापित रूप से,एक निविष्ट पंक्ति निविष्ट अभिलेख है,  क्षेत्र अभिलेख पूर्वस्थापित वर्ण एक 'नई पंक्ति' है।
 * उत्पादन क्षेत्र विभाजक। उत्पादन क्षेत्र विभाजक को संग्रहीत करता है, जो क्षेत्र को तब अलग करता है जब एडब्ल्यूके उन्हें छापता है। पूर्वस्थापित एक स्थान वर्ण है।
 * : उत्पादन अभिलेख विभाजक। उत्पादन अभिलेख विभाजक को संग्रहीत करता है, जो उत्पादन अभिलेख को तब अलग करता है जब एडब्ल्यूके उन्हें छापता है। पूर्वस्थापित वर्ण एक 'नई पंक्ति' है।
 * : उत्पादन स्वरूप। संख्यात्मक उत्पादन के लिए प्रारूप को संगृहीत करता है। पूर्वस्थापित प्रारूप %.6g है।

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

उपयोगकर्ता परिभाषित कार्य
सी (प्रोग्रामिंग भाषा) के समान प्रारूप में, फ़ंक्शन परिभाषाओं में कीवर्ड शामिल होता है, कार्य नाम, तर्क नाम और यहाँ एक फ़ंक्शन का उदाहरण दिया गया है। function add_three (number) { return number + 3 } This This statement can be invoked as follows: (pattern) { print add_three(36)    # Outputs  39  } फ़ंक्शंस में चर हो सकते हैं जो स्थानीय दायरे में हैं। इनके नाम तर्क सूची के अंत में जोड़े जाते हैं, हालांकि फ़ंक्शन को आव्हान करते समय इनके लिए मान छोड़े जाने चाहिए। स्थानीय चर से पहले तर्क सूची में कुछ श्वेत स्थान चरित्र जोड़ने के लिए यह अतिआवश्यक है, यह इंगित करने के लिए कि मापदंड कहां समाप्त होते हैं और स्थानीय चर शुरू होते हैं।

नमस्ते दुनिया
यहाँ प्रथागत हैलो, वर्ल्ड है! प्रोग्राम नमस्ते दुनिया कार्यक्रम एडब्ल्यूके में लिखा गया है: BEGIN { print "Hello, world!" exit }

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

80 वर्णों से अधिक लंबी सभी पंक्तियों को प्रिंट करें। ध्यान दें कि पूर्वस्थापित क्रिया मौजूदा पंक्ति को छापता है। length($0) > 80

शब्द गिनें
इनपुट में शब्दों की गणना करें और पंक्तियों, शब्दों और वर्णों की संख्या छापे (जैसे wc (यूनिक्स)): <वाक्यविन्यास लैंग = awk> { {     words += NF     chars += length + 1 # add one to account for the newline character at the end of each record (line) } END { print NR, words, chars } चूंकि कार्यक्रम की पहली पंक्ति के लिए कोई श्रृंखला नहीं है, निविष्ट की प्रत्येक पंक्ति पूर्वानिर्धारित रूप से मेल खाती है, इसलिए प्रत्येक पंक्ति के लिए वृद्धि क्रियाएं निष्पादित की जाती हैं। ध्यान दें कि  के लिए आशुलिपि है.

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

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

निविष्ट पंक्तियों की एक श्रृंखला का मिलान करें
NR % 4 == 1, NR % 4 == 3 { printf "%6d %s\n", NR, $0 } कार्य विवरण प्रत्येक पंक्ति क्रमांकित छापता है। Printf फ़ंक्शन मानक C Printf का अनुकरण करता है और ऊपर वर्णित छापने के आदेश के समान कार्य करता है। हालांकि,मिलान करने के लिए श्रृंखला में निम्नानुसार काम करता है: एनआर अभिलेखों की संख्या है,सामान्य तौर पर निविष्ट की पंक्तियां,यानी निविष्ट की पहली पंक्ति के लिए 1 से शुरू होने वाली मौजूदा पंक्ति संख्या % मापांक संचालक है। एनआर% 4 == 1 पहली, 5वीं, 9वीं, आदि, निविष्ट की पंक्तियों के लिए सत्य है। इसी प्रकार, एनआर% 4 == 3 निविष्ट की तीसरी, 7वीं, 11वीं, आदि के लिए सही है। क्रम श्रृंखला तब तक मान्य नहीं है जब तक कि पहला भाग पंक्ति 1 पर मेल नहीं खाता है, और तब तक सही रहता है और जब दूसरा भाग मेल खाता है, तब तक पंक्ति 3 पर होता है। यह तब तक अमान्य रहता है जब तक कि पहला भाग पंक्ति 5 पर फिर से मेल नहीं खाता।

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

पिछला कार्यक्रम छापता है: 1 Rome 2 Florence 3 Milan 5 Turin 6 Venice

फ़ाइल के प्रारंभिक या अंतिम भाग को छापना
एक विशेष मामले के रूप में, जब क्रम श्रृंखला का पहला भाग लगातार मान्य होता है, उदाहरण 1, निविष्ट क्रम की शुरुआत में शुरू होगी। इसी तरह, यदि दूसरा भाग लगातार अमान्य है, उदाहरण 0, निविष्ट के अंत तक सीमा जारी रहेगी। उदाहरण के लिए,

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

शब्द आवृत्तियों की गणना करें
साहचर्य सरणियों का उपयोग करते हुए शब्द आवृत्ति: <वाक्यविन्यास लैंग = awk> शुरू करना { BEGIN { FS="[^a-zA-Z]+" } {    for (i=1; i<=NF; i++) words[tolower($i)]++ } END { for (i in words) print i, words[i] } BEGIN ब्लॉक क्षेत्र विभाजक को बिना अंग्रेजी वर्णमाला के किसी भी क्रम में समाहित करता है। ध्यान दें कि विभाजक नियमित अभिव्यक्ति हो सकते हैं। उसके बाद, हम एक अंतिम क्रिया पर जाते हैं, जो प्रत्येक निविष्ट पंक्ति पर क्रिया करता है। इस मामले में, पंक्ति पर प्रत्येक क्षेत्र के लिए, हम उस शब्द की संख्या में एक जोड़ देते हैं, जो पहले निचले स्तर में बदला गया शब्द प्रकट होता है। अंत में, END ब्लॉक में,हम शब्दों को उनकी आवृत्तियों के साथ छापते हैं। पंक्ति के लिए शब्दों में for (i in words) एक गांठ बनाता है जो सरणी शब्दों के माध्यम से जाता है, i को सरणी के प्रत्येक उपपटकथा पर स्थित करता है। यह अधिकांश भाषाओं से अलग है, जहां ऐसा लूप सरणी में प्रत्येक मान से होकर जाता है। लूप इस प्रकार प्रत्येक शब्द को उसकी आवृत्ति गणना के बाद छापता है। टोलॉवेर पुस्तक प्रकाशित होने के बाद किए गए वन ट्रू ऑक (नीचे देखें) में एक अतिरिक्त था।

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

इसे लिखने के वैकल्पिक तरीके हैं। यह सीप पटकथा पर्यावरण को सीधे awk के भीतर से एक्सेस करती है: export pattern="$1" shift awk '$0 ~ ENVIRON["pattern"] { print FILENAME ":" $0 }' "$@" यह एक सीप पटकथा है जो उपयोग करती है, पुस्तक प्रकाशित होने के बाद वन ट्रू ओक के एक नए संस्करण में प्रस्तुत की गई एक सरणी का पटकथा  एक पर्यावरण चर का नाम है; इसका परिणाम चर का मान है। यह विभिन्न मानक पुस्तकालयों और पॉज़िक्स में getenv कार्य की तरह है। सीप पटकथा एक पर्यावरण चर बनाती है   पहला तर्क शामिल है, फिर वह तर्क छोड़ देता है और प्रत्येक फ़ाइल में श्रृंखला के लिए अजीब दिखता है।
 * 1) !/bin/sh

यह देखने के लिए जाँच करता है कि क्या उसका बायाँ संकार्य उसके दाएँ संकार्य से मेल खाता है;  इसका उलटा है। ध्यान दें कि नियमित अभिव्यक्ति एक श्रृंखला है और इसे चर में संग्रहीत किया जा सकता है।

अगला तरीका आदेश पंक्ति चर कार्यभार का उपयोग करता है, जिसमें एडब्ल्यूके के तर्क को एक चर के कार्यभार के रूप में देखा जा सकता है pattern="$1" shift awk '$0 ~ pattern { print FILENAME ":" $0 }' "pattern=$pattern" "$@" या आप -v var=value आदेश पंक्ति विकल्प (जैसे awk -v pattern= $pattern ...) का उपयोग कर सकते हैं।
 * 1) !/bin/sh

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

शुरू करना { BEGIN { pattern = ARGV[1] for (i = 1; i < ARGC; i++) # remove first argument ARGV[i] = ARGV[i + 1] ARGC-- if (ARGC == 1) { # the pattern was the only thing, so force read from standard input (used by book) ARGC = 2 ARGV[1] = "-" } } $0 ~ pattern { print FILENAME ":" $0 }   e> न केवल पहले तर्क को निकालने के लिए आवश्यक है, बल्कि इसे बाद में फ़ाइल नाम के रूप में व्याख्या किए जाने से रोकने के लिए भी आवश्यक है   ब्लॉक समाप्त होता है। , तर्कों की संख्या, हमेशा ≥1 होने की गारंटी है, जैसा कि   आदेश का नाम है जो पटकथा को निष्पादित करता है, अक्सर तार. यह भी ध्यान दें  खाली तार है,. एक टिप्पणी आरंभ करता है जो पंक्ति के अंत तक विस्तृत होती है।

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

स्व-निहित एडब्ल्यूके पटकथा
यूनिक्स जैसे स्वयं निहित संचालक तंत्र  (यूनिक्स) सिंटैक्स का उपयोग करके एडब्ल्यूके पटकथा का निर्माण किया जा सकता है।

उदाहरण के लिए, एक पटकथा जो किसी फ़ाइल की सामग्री को छापती है,नाम की फ़ाइल बनाकर बनाई जा सकती है  निम्नलिखित सामग्री के साथ: { print $0 } इसके साथ आह्वान किया जा सकता है:
 * 1) !/usr/bin/awk -f

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

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

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

यूनिक्स के पुराने संस्करण,जैसे यूनिक्स/32वी,शामिल हैं ,जिसने एडब्ल्यूके को C में बदल दिया। कर्निघन ने awk को C++ में बदलने के लिए एक प्रोग्राम लिखा; इसकी स्थिति ज्ञात नहीं है।
 * बीडब्लूके एडब्ल्यूके, जिसे nawk के नाम से भी जाना जाता है, ब्रायन कर्निघन के संस्करण को संदर्भित करता है। मूल रूप से भाषा का वर्णन करने वाली पुस्तक के साथ इस शब्द के उपयोग के कारण इसे वन ट्रू एडब्ल्यूके करार दिया गया है और तथ्य यह है कि कर्निघन एडब्ल्यूके के मूल लेखकों में से एक थे। FreeBSD इस संस्करण को वन ट्रू ओक के रूप में संदर्भित करता है। इस संस्करण में ऐसी विशेषताएं भी हैं जो पुस्तक में नहीं हैं, जैसे  तथा   जिनकी व्याख्या ऊपर की गई है; विवरण के लिए स्रोत संग्रह में FIXES फ़ाइल देखें। इस संस्करण का उपयोग, उदाहरण के लिए, एंड्रॉयड (ऑपरेटिंग सिस्टम), FreeBSD, NetBSD, OpenBSD, macOS, और इलुमोस द्वारा किया जाता है। ब्रायन कर्निघन और अर्नोल्ड रॉबिंस, नॉक के लिए स्रोत रिपॉजिटरी में मुख्य योगदानकर्ता हैं: https://github.com/onetrueawk/awk.
 * (GNU awk) एक और फ्री-सॉफ्टवेयर कार्यान्वयन है और एकमात्र कार्यान्वयन है जो अंतर्राष्ट्रीयकरण और स्थानीयकरण और TCP/IP नेटवर्किंग को लागू करने में गंभीर प्रगति करता है। यह मूल कार्यान्वयन के स्वतंत्र रूप से उपलब्ध होने से पहले लिखा गया था। इसमें अपना स्वयं का डिबगर शामिल है, और इसकी प्रोफाइलिंग (कंप्यूटर प्रोग्रामिंग) उपयोगकर्ता को एक स्क्रिप्ट के लिए मापित प्रदर्शन संवर्द्धन करने में सक्षम बनाती है। यह उपयोगकर्ता को साझा पुस्तकालयों के साथ कार्यक्षमता बढ़ाने में भी सक्षम बनाता है। कुछ लिनक्स वितरणों में उनके पूर्वनिर्धारित एडब्ल्यूके कार्यान्वयन के रूप में गौक शामिल है।
 * गॉक-सीएसवी। अल्पविराम से अलग किये गए मान विस्तार गॉक निविष्ट और उत्पादन सीएसवी स्वरूपित डेटा को संभालने की सुविधा प्रदान करता है।
 * मॉक माइक ब्रेनन द्वारा बाईटकोड दुभाषिया पर आधारित एक बहुत तेज़ एडब्ल्यूके कार्यान्वयन है।
 * libmawk mawk का एक फोर्क है, जो आवेदन को एडब्ल्यूके दुभाषियों के कई समानांतर उदाहरणों को अंतर्निहित करने की अनुमति देता है।
 * awka (जिसका फ्रंट एंड mawk प्रोग्राम के ऊपर लिखा हुआ है) C कोड में एडब्ल्यूके पटकथा का एक और अनुवादक है जो संकलित किया जाता है, लेखक के libawka.a सहित सांख्यिकीय रूप से, परिणामी निष्पादनयोग्य काफी तेज हो जाते हैं और लेखक के परीक्षणों के अनुसार, एडब्ल्यूके,पर्ल, या Tcl के अन्य संस्करणों के साथ बहुत अच्छी तरह से तुलना करते हैं। छोटी पटकथा 160–170 kB के प्रोग्राम में बदल जाएँगी।
 * टॉक (थॉम्पसन AWK) सोलारिस (प्रचालन तंत्र), DOS, OS/2, और माइक्रोसॉफ्ट विंडोज के लिए एक एडब्ल्यूके संकलक है, जो पहले थॉम्पसन ऑटोमेशन सॉफ्टवेयर द्वारा बेचा जाता था (जिसने अपनी गतिविधियाँ बंद कर दी हैं)।
 * Jawk Java (प्रोग्रामिंग लैंग्वेज) में एडब्ल्यूके को लागू करने की एक परियोजना है, जिसे सोर्स फोर्ज  पर होस्ट किया गया है। एडब्ल्यूके पटकथा (यानी, जावा थ्रेड्स, सॉकेट्स, संग्रह, आदि) के भीतर जावा सुविधाओं तक पहुंच प्रदान करने के लिए भाषा में विस्तार जोड़े गए हैं।
 * xgawk  gawk  का एक कांटा है जो गतिशील रूप से लोड करने योग्य पुस्तकालयों के साथ गॉक का विस्तार करता है। XMLgawk विस्तार को आधिकारिक GNU Awk रिलीज़ 4.1.0 में एकीकृत किया गया था।
 * 'QSEAWK' QSE लाइब्रेरी में शामिल एक एम्बेडेड AWK दुभाषिया कार्यान्वयन है जो C (प्रोग्रामिंग भाषा) और C++ के लिए एम्बेडिंग अप्लिकेशन प्रोग्रामिंग अंतरफलक (API) प्रदान करता है।
 * libfawk सी में लिखा गया एक बहुत छोटा, केवल-फ़ंक्शन, रीएन्ट्रेंट, व्यवस्था करने योग्य दुभाषिया है
 * बिजीबॉक्स में दिमित्री ज़खारोव द्वारा लिखित एडब्ल्यूके कार्यान्वयन शामिल है। यह अंतर्निहित व्यवस्था के लिए उपयुक्त एक बहुत छोटा कार्यान्वयन है।
 * माइकल पार्कर द्वारा CLAWK एक ही लेखक की नियमित अभिव्यक्ति लाइब्रेरी के आधार पर सामान्य लिस्प में एडब्ल्यूके कार्यान्वयन प्रदान करता है।
 * 'QSEAWK' QSE लाइब्रेरी में शामिल एक एम्बेडेड AWK दुभाषिया कार्यान्वयन है जो C (प्रोग्रामिंग भाषा) और C++ के लिए एम्बेडिंग अप्लिकेशन प्रोग्रामिंग अंतरफलक (API) प्रदान करता है।
 * libfawk सी में लिखा गया एक बहुत छोटा, केवल-फ़ंक्शन, रीएन्ट्रेंट, व्यवस्था करने योग्य दुभाषिया है
 * बिजीबॉक्स में दिमित्री ज़खारोव द्वारा लिखित एडब्ल्यूके कार्यान्वयन शामिल है। यह अंतर्निहित व्यवस्था के लिए उपयुक्त एक बहुत छोटा कार्यान्वयन है।
 * माइकल पार्कर द्वारा CLAWK एक ही लेखक की नियमित अभिव्यक्ति लाइब्रेरी के आधार पर सामान्य लिस्प में एडब्ल्यूके कार्यान्वयन प्रदान करता है।

किताबें

 * अहो, अल्फ्रेड वी .; कर्निघन, ब्रायन डब्ल्यू .; वेनबर्गर, पीटर जे। (1988-01-01)। AWK प्रोग्रामिंग लैंग्वेज । न्यूयॉर्क, एनवाई: एडिसन-वेस्ले । आईएसबीएन 0-201-07981-एक्स. 2017-01-22 को पुनःप्राप
 * रॉबिन्स, अर्नोल्ड (2001-05-15)। प्रभावी awk प्रोग्रामिंग (तीसरा संस्करण)। सेबेस्टोपोल, सीए: ओ रेली मीडिया । आईएसबीएन 0-596-00070-7. 2009-04-16 को पुनःप्राप्त ।
 * डौघर्टी, डेल ; रॉबिन्स, अर्नोल्ड (1997-03-01)। सेड और ऑक (दूसरा संस्करण)। सेबेस्टोपोल, सीए: ओ रेली मीडिया। आईएसबीएन 1-56592-225-5. 2009-04-16 को पुनःप्राप्त ।
 * रॉबिन्स, अर्नोल्ड (2000)। प्रभावी Awk प्रोग्रामिंग: Gnu Awk के लिए उपयोगकर्ता की मार्गदर्शिका (1.0.3 संस्करण)। ब्लूमिंगटन, आईएन: आईयूनिवर्स । आईएसबीएन 0-595-10034-1. 12 अप्रैल 2009 को मूल से संग्रहीत । 2009-04-16 को पुनःप्राप्त ।

यह भी देखें

 * डेटा परिवर्तन
 * घटना-संचालित प्रोग्रामिंग
 * यूनिक्स कमांड की सूची
 * सेड

जर्नल । मूल से 21 फरवरी, 2020 को पुरालेखित । 21 फरवरी, 2020 को पुनःप्राप्त ।

अग्रिम पठन

 * एंडी ओरम (19 मई, 2021)। "ऑक: द पावर एंड प्रॉमिस ऑफ़ ए 40-ईयर-ओल्ड लैंग्वेज" । जीवाश्म । 9 जून, 2021 को पुनःप्राप्त ।
 * हैमिल्टन, नाओमी (30 मई, 2008)। "प्रोग्रामिंग भाषाओं का AZ: AWK" । कंप्यूटरवर्ल्ड । 2008-12-12 को पुनःप्राप्त । - AWK पर अल्फ्रेड वी. अहो के साथ साक्षात्कार
 * रॉबिंस, डेनियल (2000-12-01)। "Awk by example, भाग 1: अजीब नाम के साथ महान भाषा का परिचय" । सामान्य धागे । आईबीएम डेवलपर वर्क्स । 2009-04-16 को पुनःप्राप्त ।
 * रॉबिन्स, डैनियल (2001-01-01)। "Awk by example, Part 2: Records, Loops, and arrays" । सामान्य धागे । आईबीएम डेवलपर वर्क्स । 2009-04-16 को पुनःप्राप्त ।
 * रॉबिन्स, डैनियल (2001-04-01)। "Awk by example, Part 3: String functions and ... checkbooks?" . सामान्य धागे । आईबीएम डेवलपर वर्क्स। 19 मई 2009 को मूल से संग्रहीत । 2009-04-16 को पुनःप्राप्त ।
 * AWK - 60 मिनट में विशेषज्ञ बनें
 * awk: पैटर्न स्कैनिंग और प्रोसेसिंग लैंग्वेज - शेल और यूटिलिटीज रेफरेंस, द सिंगल यूनिक्स स्पेसिफिकेशन, ओपन ग्रुप से वर्जन 4
 * gawk(1) -  लिनक्स यूजर मैनुअल - यूजर कमांड्स

बाहरी संबंध

 * हेनरी स्पेंसर द्वारा byअमेजिंग ऑक असेंबलर ।
 * कर्ली at AWK
 * awklang.org The site for things related to the awk language