एडब्ल्यूके

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

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

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

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

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

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

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

-  -

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

स्थिति {  गतिविधि  } ..

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

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

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

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

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


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


 * वर्तमान रिकॉर्ड का पहला क्षेत्र प्रदर्शित करता है
 * वर्तमान रिकॉर्ड का पहला क्षेत्र प्रदर्शित करता है


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

हालांकि ये क्षेत्र ($X) चर के समान हो सकते हैं ($ प्रतीक पर्ल में चर को इंगित करता है), वे वास्तव में वर्तमान रिकॉर्ड के क्षेत्र को संदर्भित करते हैं। एक विशेष मामला, $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 पूरे रिकॉर्ड का प्रतिनिधित्व करता है)। वे रिकॉर्ड में अलग-अलग टेक्स्ट-फ़ील्ड में टेक्स्ट या मान रखते हैं।

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

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

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

इस कथन को निम्नानुसार लागू किया जा सकता है: <वाक्यविन्यास लैंग = awk> (नमूना) { प्रिंट ऐड_थ्री (36) # आउटपुट 39 } 

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

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

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

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

शब्द गिनें
इनपुट में शब्दों की गणना करें और पंक्तियों, शब्दों और वर्णों की संख्या प्रिंट करें (जैसे wc (यूनिक्स)): <वाक्यविन्यास लैंग = awk> {   शब्द + = एनएफ वर्ण + = लंबाई + 1 # प्रत्येक रिकॉर्ड (पंक्ति) के अंत में न्यूलाइन वर्ण के लिए खाते में एक जोड़ें } END {प्रिंट एनआर, शब्द, वर्ण} 

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

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

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

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

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

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

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

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

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

अगला तरीका कमांड-लाइन वेरिएबल असाइनमेंट का उपयोग करता है, जिसमें 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   e> न केवल पहले तर्क को निकालने के लिए आवश्यक है, बल्कि इसे बाद में फ़ाइल नाम के रूप में व्याख्या किए जाने से रोकने के लिए भी आवश्यक है   ब्लॉक समाप्त होता है। , तर्कों की संख्या, हमेशा ≥1 होने की गारंटी है, जैसा कि   कमांड का नाम है जो स्क्रिप्ट को निष्पादित करता है, अक्सर स्ट्रिंग. यह भी ध्यान दें  खाली स्ट्रिंग है,. एक टिप्पणी आरंभ करता है जो पंक्ति के अंत तक विस्तृत होती है।

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

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

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

इसके साथ आह्वान किया जा सकता है:

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

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

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

यह भी देखें

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

अग्रिम पठन

 * – Interview with Alfred V. Aho on AWK
 * AWK –  Become an expert in 60 minutes
 * AWK –  Become an expert in 60 minutes
 * AWK –  Become an expert in 60 minutes
 * AWK –  Become an expert in 60 minutes
 * AWK –  Become an expert in 60 minutes

बाहरी संबंध

 * The Amazing Awk Assembler by Henry Spencer.
 * awklang.org The site for things related to the awk language
 * awklang.org The site for things related to the awk language