एडब्ल्यूके
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
खिसक जाना
awk '/' $pattern '/ { Print FILENAME : $0 }' $@
</वाक्यविन्यास हाइलाइट> $pattern e> awk कमांड में सिंगल कोट्स द्वारा संरक्षित नहीं है ताकि शेल वेरिएबल का विस्तार करे लेकिन रिक्त स्थान वाले पैटर्न को ठीक से संभालने के लिए इसे डबल कोट्स में डालने की आवश्यकता है। सामान्य तरीके से एक पैटर्न यह देखने के लिए जांच करता है कि क्या पूरी लाइन ($0) मेल खाता है। FILENAME वर्तमान फ़ाइल नाम शामिल है। awk का कोई स्पष्ट संयोजन संचालिका नहीं है; दो निकटवर्ती तार उन्हें जोड़ते हैं। $0 मूल अपरिवर्तित इनपुट लाइन तक फैलता है।
इसे लिखने के वैकल्पिक तरीके हैं। यह शेल स्क्रिप्ट पर्यावरण को सीधे awk के भीतर से एक्सेस करती है: <वाक्यविन्यास लैंग = बैश>
- !/बिन/श
निर्यात पैटर्न = $1 खिसक जाना awk '$0 ~ ENVIRON[ pattern ] { Print FILENAME : $0 }' $@ </वाक्यविन्यास हाइलाइट>
यह एक शेल स्क्रिप्ट है जो उपयोग करती है ENVIRON, पुस्तक प्रकाशित होने के बाद One True awk के एक नए संस्करण में प्रस्तुत की गई एक सरणी। का सबस्क्रिप्ट ENVIRON एक पर्यावरण चर का नाम है; इसका परिणाम चर का