एडब्ल्यूके
यह लेख प्रोग्रामिंग भाषा के बारे में है। अन्य उपयोगों के लिए, एडब्ल्यूके (बहुविकल्पी) देखें ।
एडब्ल्यूके (awk)[1]एक डोमेन-विशिष्ट भाषा है जिसे पाठ प्रसंस्करण के लिए रचित किया गया है और सामान्यतौर पर जानकारी निष्कर्षण और लेखन उपकरण के रूप में उपयोग किया जाता है। सेड और ग्रेप की तरह,यह एक फिल्टर (सॉफ्टवेयर) है,[1] और अधिकांश यूनिक्स जैसे प्रचालन तंत्र की एक मानक विशेषता है।
एडब्ल्यूके भाषा एक जानकारी संचालन पटकथा(स्क्रिप्टिंग) भाषा है जिसमें पाठ्य जानकारी की श्रृंखलाओं के विपरीत की जाने वाली क्रियाओं का एक समूह होता है जिसमें विषय वस्तु निकालने या बदलने के उद्देश्य से या तो सीधे फाइलों पर कार्य करता है या एक पाइपलाइन के हिस्से के रूप में उपयोग किया जाता है- जैसे स्वरूपित विवरण तैयार करना। ये भाषा बड़े पैमाने पर जानकारी प्रकार की श्रृंखलाओं ,सहयोगी सरणी,और नियमित अभिव्यक्तियों का उपयोग करती है। जबकि एडब्ल्यूके का एक सीमित प्रयोजन कार्यक्षेत्र (सॉफ्टवेयर इंजीनियरिंग) है और इसे विशेष रूप से एक-पंक्तिय कार्यक्रमो का समर्थन करने के लिए रचित किया गया था, भाषा ट्यूरिंग-पूर्ण है,और यहां तक कि एडब्ल्यूके के प्रारंभिक बेल लैब्स उपयोगकर्ता अक्सर अच्छी तरह से संरचित बड़े एडब्ल्यूके प्रोग्राम लिखते थे।[2]
एडब्ल्यूके को 1970 के दशक में बेल लैब्स में बनाया गया था,[3] और इसका नाम इसके लेखकों के उपनामों से लिया गया है: मैं अल्फ्रेड हूं, पीटर जे वेनबर्गर और ब्रायन कर्निघन। परिवर्णी शब्द का उच्चारण पक्षी औक (auk) के नाम के समान ही किया जाता है, जो एडब्ल्यूके प्रोग्रामिंग भाषा के कवर पर है।[4] जब सभी छोटे अक्षरों में लिखा जाता है, जैसे awk
,यह बेल लैब्स प्रोग्राम के यूनिक्स या परियोजना 9 को संदर्भित करता है जो एडब्ल्यूके प्रोग्रामिंग भाषा में लिखी गई पटकथा को चलाता है।
इतिहास
एडब्ल्यूके को शुरू में 1977 में अल्फ्रेड अहो(A),पीटर जे. वेनबर्गर(W),और ब्रायन कर्निघन(K )द्वारा विकसित किया गया था। एडब्ल्यूके नाम इसके लेखकों के उपनाम के पहले अक्षर से लिया गया है। कर्निघन के अनुसार,एडब्ल्यूके के लक्ष्यों में से एक ऐसा उपकरण होना था जो आसानी से संख्याओं और श्रृंखलाओं दोनों में कुशलता से काम कर सके। एडब्ल्यूके मार्क रोचकिंड की प्रोग्रामिंग भाषा से भी प्रेरित था जिसका उपयोग निविष्ट(इनपुट) जानकारी में प्रतिरूप खोजने के लिए किया गया था,और इसे yacc का उपयोग करके लागू किया गया था।[5]
संस्करण 7 यूनिक्स में प्रकट होने वाले शुरुआती उपकरणों में से एक के रूप में,एडब्ल्यूके ने बॉर्न शेल के अलावा एक यूनिक्स पाइपलाइन में गणितीय सुविधाएँ जोड़ीं, जो मानक यूनिक्स वातावरण में उपलब्ध एकमात्र पटकथा भाषा है। यह एकल यूनिक्स विशिष्टता की अनिवार्य उपयोगिताओं में से एक है,[6] और लिनक्स मानक आधार विनिर्देश द्वारा आवश्यक है।[7]एडब्ल्यूके को 1985-88 में महत्वपूर्ण रूप से संशोधित और विस्तारित किया गया था, जिसके परिणामस्वरूप 1988 में जारी पॉल रूबिन जे फेनलसन और रिचर्ड स्टालमैन द्वारा लिखित गॉक(GNU पैकेज) कार्यान्वयन हुआ।[8]जीएनयू एडब्ल्यूके सबसे व्यापक रूप से तैनात संस्करण हो सकता है[9] क्योंकि यह जीएनयू-आधारित लिनक्स पैकेज में शामिल है। 1994 से केवल अर्नोल्ड रॉबिंस ने जीएनयू एडब्ल्यूके को बनाए रखा गया है।[8] ब्रायन कर्निघन का नॉक (न्यू एडब्ल्यूके) स्रोत पहली बार 1993 में अप्रकाशित और 1990 के दशक के अंत से सार्वजनिक रूप से जारी किया गया था; कई बीएसडी व्यवस्था जीपीएल अनुज्ञा पत्र से बचने के लिए इसका इस्तेमाल करते हैं।[8]
एडब्ल्यूके सेड(1974) से पहले था। दोनों को पाठ प्रसंस्करण के लिए रचित किया गया था। वे पंक्ति-उन्मुख,जानकारी-संचालित प्रतिमान साझा करते हैं,और अंतर्निहित मुख्य लूप और मौजूदा पंक्ति चर के अंतर्निहित एक-पंक्तिय प्रोग्राम लिखने के लिए विशेष रूप से उपयुक्त हैं। प्रारंभिक एडब्ल्यूके कार्यक्रमों की शक्ति और कठोरता और साथ में उस समय एडब्ल्यूके की सीमाएं- विशेष रूप से शक्तिशाली नियमित अभिव्यक्ति से निपटने और निहित चर के कारण संक्षिप्तता,जो एक-पंक्तिय सुविधा प्रदान करते हैं - पर्ल भाषा (1987) के लिए महत्वपूर्ण प्रेरणा थीं। 1990 के दशक में,पर्ल बहुत लोकप्रिय हो गया था, यूनिक्स पाठ-प्रसंस्करण भाषाओं के सन्दर्भ में एडब्ल्यूके साथ प्रतिस्पर्धा कर रहा था।
एडब्ल्यूके कार्यक्रमों की संरचना
एडब्ल्यूके निविष्ट को एक बार में एक पंक्ति में पढ़ता है। कार्यक्रम में प्रत्येक प्रतिरूप के लिए एक पंक्ति जांची जाती है,और प्रत्येक प्रतिरूप के लिए मिलान किया जाता है, और संबंधित क्रिया निष्पादित की जाती है।
- -
एडब्ल्यूके प्रोग्राम प्रतिरूप गतिविधि जोड़े की एक श्रृंखला है, जिसे इस प्रकार लिखा गया है:
condition { action } condition { action } ...
जहां स्थिति सामान्यतौर पर एक अभिव्यक्ति है और क्रिया आदेशों की एक श्रृंखला है। निविष्ट को अभिलेख में विभाजित किया जाता है,जहां पूर्वनिर्धारित रूप से अभिलेख को नई पंक्ति वर्णों से अलग किया जाता है ताकि निविष्ट को पंक्तियों में विभाजित किया जा सके। कार्यक्रम बदले में प्रत्येक स्थिति के विरुद्ध प्रत्येक अभिलेख का परीक्षण करता है,और प्रत्येक सत्य अभिव्यक्ति के लिए क्रिया निष्पादित करता है या क्रिया को छोड़ा जा सकता है।यह स्तिथि सभी अभिलेख से मेल खाने के लिए बाध्य है। अभिलेख को छापना महत्वपूर्ण क्रिया है। यह सेड के समान श्रृंखला-क्रिया संरचना है।
एक साधारण एडब्ल्यूके अभिव्यक्ति के अलावा, जैसे foo == 1
या /^foo/
स्थिति हो सकती है BEGIN
या END
सभी अभिलेख पढ़ने से पहले या बाद में कार्रवाई को निष्पादित करने का कारण बनता है,या श्रृंखला 1,श्रृंखला 2 जो एक अभिलेख से शुरू होने वाले अभिलेख की श्रेणी से मेल खाता है जो श्रृंखला1 से मेल खाता है और उस अभिलेख को शामिल करता है जो श्रृंखला 2 से मेल खाता है और बाद की पंक्तियों को श्रृंखला 1 के विपरीत फिर से मिलान करने का प्रयास करता है।
सामान्य अंकगणितीय और तार्किक संचालकों के अलावा,एडब्ल्यूके अभिव्यक्ति में टिल्ड संचालक शामिल है, ~
, जो एक श्रृंखला के विपरीत एक नियमित अभिव्यक्ति से मेल खाता है। सुविधाजनक सिंटैक्टिक चीनी के रूप में, /regexp/ टिल्ड संचालक का उपयोग किए बिना मौजूदा रिकॉर्ड के विपरीत मेल खाता है; यह सिंटैक्स sed से निकला है, जो बदले में इसे एड (टेक्स्ट एडिटर) संपादक से विरासत में मिला है, जहाँ /
खोजने के लिए प्रयोग किया जाता है। नियमित अभिव्यक्ति के लिए सीमांकक के रूप में स्लैश का उपयोग करने का यह सिंटैक्स बाद में पर्ल और ईसीएमए पटकथा द्वारा अपनाया गया था,और अब जन साधारण है। पर्ल द्वारा टिल्ड संचालक को भी अपनाया गया था।
आदेश
एडब्ल्यूके कमांड वे कथन हैं जो उपरोक्त उदाहरणों में कार्रवाई के लिए प्रतिस्थापित किए गए हैं। एडब्ल्यूके आदेश में कार्य आह्वान (फंक्शन कॉल ),चर कार्यभार,गणना,या कोई संयोजन शामिल हो सकता है। एडब्ल्यूके में कई कार्यों के लिए अंतर्निहित समर्थन शामिल है;एडब्ल्यूके के विभिन्न प्रतिभा द्वारा और भी बहुत कुछ प्रदान किया जाता है। साथ ही,कुछ प्रतिभा गतिशील रूप से जोड़ी गई लाइब्रेरी को शामिल करने का समर्थन करते हैं, जो अधिक कार्य भी प्रदान कर सकता है।
प्रिंट आदेश
प्रिंट आदेश का उपयोग लिखित सामग्री को उत्पादन करने के लिए किया जाता है। उत्पादित लिखित सामग्री हमेशा एक पूर्वनिर्धारित श्रृंखला के साथ समाप्त होता है जिसे श्रृंखला अभिलेख विभाजक (ओआरएस) कहा जाता है जिसका पूर्वनिर्धारित मान एक नई पंक्ति है। इस आदेश का सबसे सरल रूप है:
print
- यह मौजूदा अभिलेख की सामग्री प्रदर्शित करता है। एडब्ल्यूके में,अभिलेख को क्षेत्रों में तोड़ा जाता है,और इन्हें अलग से प्रदर्शित किया जा सकता है:
print $1
- मौजूदा अभिलेख का पहला क्षेत्र प्रदर्शित करता है
print $1, $3
- मौजूदा अभिलेख के पहले और तीसरे क्षेत्र को प्रदर्शित करता है, जिसे एक पूर्वनिर्धारित श्रृंखला द्वारा अलग किया जाता है जिसे उत्पादन क्षेत्र विभाजक (OFS) कहा जाता है, जिसका पूर्वनिर्धारित मान एक अन्तर वर्ण है।
हालांकि ये क्षेत्र ($X) चर के समान हो सकते हैं ($ प्रतीक पर्ल में चर को इंगित करता है), वे वास्तव में मौजूदा अभिलेख के क्षेत्र को संदर्भित करते हैं। एक विशेष अवस्था मे, $0, पूरे अभिलेख को संदर्भित करता है। वास्तव में, आदेशprint
तथाprint $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 पूरे अभिलेख का प्रतिनिधित्व करता है)। वे अभिलेख में अलग-अलग लिखित सामग्री क्षेत्र में लिखित सामग्री या मान रखते हैं।
अन्य चर में शामिल हैं:
NR
: अभिलेखों की संख्या। सभी जानकारी फ़ाइलों से अब तक पढ़े गए निविष्ट अभिलेख की संख्या की मौजूदा गणना रखता है। यह शून्य से शुरू होता है, लेकिन कभी भी स्वचालित रूप से शून्य पर फिर से स्थापित नहीं होता है।[10]FNR
: अभिलेख की फ़ाइल संख्या। मौजूदा फ़ाइल में अब तक पढ़े गए निविष्ट अभिलेख की संख्या की तत्काल गणना रखता है। हर बार जब कोई नई फ़ाइल शुरू होती है तो यह चर स्वचालित रूप से शून्य पर फिर से स्थापित हो जाता है।[10]*NF
: क्षेत्रों की संख्या। मौजूदा निविष्ट अभिलेख में क्षेत्र की संख्या शामिल है। निविष्ट अभिलेख में अंतिम क्षेत्र को $NF, दूसरे से अंतिम क्षेत्र को $(NF-1), तीसरे से अंतिम क्षेत्र को $(NF-2), आदि द्वारा निर्दिष्ट किया जा सकता है।FILENAME
: मौजूदा निविष्ट-फ़ाइल का नाम समाहित करता है।FS
: क्षेत्र विभाजक। निविष्ट अभिलेखमें क्षेत्र को विभाजित करने के लिए उपयोग किए जाने वाले क्षेत्र विभाजक शामिल हैं। पूर्वस्थापित,श्वेत स्थान और टैब वर्णों के किसी भी क्रम की अनुमति देता है। क्षेत्र विभाजक को बदलने के लिए FS को किसी अन्य वर्ण या वर्ण अनुक्रम के साथ पुन: सौंपा जा सकता है।RS
:अभिलेख विभाजक। मौजूदा अभिलेख विभाजक चरित्र को संग्रहीत करता है। चूंकि, पूर्वस्थापित रूप से,एक निविष्ट पंक्ति निविष्ट अभिलेख है, क्षेत्र अभिलेख पूर्वस्थापित वर्ण एक 'नई पंक्ति' है।OFS:
उत्पादन क्षेत्र विभाजक। उत्पादन क्षेत्र विभाजक को संग्रहीत करता है, जो क्षेत्र को तब अलग करता है जब एडब्ल्यूके उन्हें छापता है। एक स्थान वर्ण पूर्वस्थापित है।ORS
: उत्पादन अभिलेख विभाजक। उत्पादन अभिलेख विभाजक को संग्रहीत करता है, जो उत्पादन अभिलेख को तब अलग करता है जब एडब्ल्यूके उन्हें छापता है। पूर्वस्थापित वर्ण एक 'नई पंक्ति' है।OFMT
: उत्पादन स्वरूप। संख्यात्मक उत्पादन के लिए प्रारूप को संगृहीत करता है। पूर्वस्थापित प्रारूप %.6g है।
चर और वाक्य रचना
चर नाम किसी भी अक्षर [A-Za-z0-9_] का उपयोग कर सकते हैं, भाषा सूचक शब्द के अपवाद के साथ। संचालको + - * / क्रमशः जोड़, घटाव, गुणा और भाग का प्रतिनिधित्व करते हैं। श्रृंखला संघनन के लिए,बस दो चर एक दूसरे के नज़दीक में रखें। यदि श्रृंखला स्थिरांक शामिल हैं, तो बीच में एक स्थान का उपयोग करना वैकल्पिक है, लेकिन एक दूसरे से सटे हुए दो चर नामों के बीच में एक स्थान की आवश्यकता होती है। दोहरे उद्धरण श्रृंखला स्थिरांक का सीमांकन करते हैं। व्याख्यान को अर्धविरामों के साथ समाप्त करने की आवश्यकता नहीं है। अंत में, एक पंक्ति पर पहले वर्ण के रूप में # का उपयोग करके कार्यक्रमों में टिप्पणियां जोड़ी जा सकती हैं।
उपयोगकर्ता परिभाषित कार्य
सी (प्रोग्रामिंग भाषा) के समान प्रारूप में, फ़ंक्शन परिभाषाओं में कीवर्ड शामिल होता है function
, कार्य नाम, तर्क नाम और यहाँ एक फ़ंक्शन का उदाहरण दिया गया है।
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 }
चूंकि कार्यक्रम की पहली पंक्ति के लिए कोई श्रृंखला नहीं है, निविष्ट की प्रत्येक पंक्ति पूर्वानिर्धारित रूप से मेल खाती है, इसलिए प्रत्येक पंक्ति के लिए वृद्धि क्रियाएं निष्पादित की जाती हैं। ध्यान दें कि words += NF
के लिए आशुलिपि है words = words + NF
.
अंतिम शब्द का योग
{ s += $NF } END { print s + 0 }
s को $NF के सांख्यिक मान से बढ़ाया जाता है, जो एडब्ल्यूके के क्षेत्र विभाजक (पूर्वनिर्धारित रूप से,श्वेत् स्थान) द्वारा परिभाषित रेखा पर अंतिम शब्द है। एनएफ मौजूदा पंक्ति में क्षेत्र की संख्या है, उदाहरण 4. चूँकि $4 चौथे क्षेत्र का मान है, $NF पंक्ति में अंतिम क्षेत्र का मान है, इस बात की परवाह किए बिना कि इस रेखा में कितने क्षेत्र हैं, या इसमें आस-पास की रेखाओं की तुलना में अधिक या कम क्षेत्र हैं। $ वास्तव में उच्चतम संचालक प्राथमिकता वाला एक एकल संचालक है। (यदि पंक्ति में कोई क्षेत्र नहीं है, तो NF 0 है, $0 पूरी पंक्ति है, जो इस मामले में संभावित सफेद स्थान के अलावा खाली है, और इसलिए इसका संख्यात्मक मान 0 है।)
निविष्ट के अंत में END श्रृंखला मेल खाता है, इसलिए s छापा जाता है। हालाँकि, एम निविष्ट की कोई पंक्ति नहीं हो सकती है, जिस स्थिति में कभी भी कोई मान निर्दिष्ट नहीं किया गया है, यह पूर्वनिर्धारित रूप से एक खाली स्ट्रिंग होगा। एक चर में शून्य जोड़ना एक एडब्ल्यूके वाक्यपद्दती है जो इसे एक श्रृंखला से संख्यात्मक मान तक ले जाने के लिए बाध्य करता है। बाध्यता के साथ प्रोग्राम एक खाली निविष्ट है पर 0 छापता है, इसके बिना, एक खाली पंक्ति छपी है।
निविष्ट पंक्तियों की एक श्रृंखला का मिलान करें
NR % 4 == 1, N % 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 ब्लॉक में,हम शब्दों को उनकी आवृत्तियों के साथ छापते हैं। पंक्ति के लिए शब्दों में एक गांठ बनाता है जो सरणी शब्दों के माध्यम से जाता है i को सरणी के प्रत्येक उपपटकथा पर स्थित करता है। यह अधिकांश भाषाओं से अलग है,जहां ऐसा लूप सरणी में प्रत्येक मान से होकर जाता है। लूप इस प्रकार प्रत्येक शब्द को उसकी आवृत्ति गणना के बाद छापता है। टोलॉवेर पुस्तक प्रकाशित होने के बाद किए गए वन ट्रू ऑक में एक अतिरिक्त था।
for (i in words)
इस कार्यक्रम को कई तरह से दर्शाया जा सकता है। पहले वाला सीप पटकथा बनाने के लिए छोटे सीप का उपयोग करता है जो सब कुछ करता है। यह इन विधियों में सबसे छोटा है:
#!/bin/sh pattern="$1" shift awk '/'"$pattern"'/ { print FILENAME ":" $0 }' "$@"
पैटर्न = $1
शिफ्ट
awk '/' $pattern '/ { Print FILENAME : $0 }' $@
</वाक्यविन्यास हाइलाइट> $pattern
e> एडब्ल्यूके आदेश में एकल कोट्स द्वारा संरक्षित नहीं है ताकि सीप चर का विस्तार करे लेकिन रिक्त स्थान वाले श्रृंखला को ठीक से संभालने के लिए इसे दोहरे कोट्स में डालने की आवश्यकता है। सामान्य तरीके से एक श्रृंखला यह देखने के लिए जांच करता है कि क्या पूरी पंक्ति ($0
) मेल खाती है और मौजूदा फाइल का नाम शामिल है। एडब्ल्यूके का कोई स्पष्ट संयोजन संचालिका नहीं है; दो निकटवर्ती तार उन्हें जोड़ते हैं। $0
मूल अपरिवर्तित निविष्ट पंक्ति तक फैलता है।
इसे लिखने के वैकल्पिक तरीके हैं। यह सीप पटकथा पर्यावरण को सीधे एडब्ल्यूके के भीतर से प्रवेश करती है:
#!/bin/sh export pattern="$1" shift awk '$0 ~ ENVIRON["pattern"] { print FILENAME ":" $0 }' "$@"
यह एक सीप पटकथा है जो उपयोग करती है ENVIRON
,पुस्तक प्रकाशित होने के बाद वन ट्रू ओक के एक नए संस्करण में प्रस्तुत की गई एक सरणी का पटकथाENVIRON
एक पर्यावरण चर का नाम है; इसका परिणाम चर का मान है। यह विभिन्न मानक पुस्तकालयों और पॉज़िक्स में सी प्रक्रिया नियंत्रण कार्य की तरह है। सीप पटकथा एक पर्यावरण चर बनाती है pattern
पहला तर्क शामिल है, फिर वह तर्क छोड़ देता है और प्रत्येक फ़ाइल में श्रृंखला के लिए अजीब दिखता है।
~
यह देखने के लिए जाँच करता है कि क्या उसका बायाँ संकार्य उसके दाएँ संकार्य से मेल खाता है; !~
इसका उलटा है। ध्यान दें कि नियमित अभिव्यक्ति एक श्रृंखला है और इसे चर में संग्रहीत किया जा सकता है।
अगला तरीका आदेश पंक्ति चर कार्यभार का उपयोग करता है, जिसमें एडब्ल्यूके के तर्क को एक चर के कार्यभार के रूप में देखा जा सकता है
#!/bin/sh pattern="$1" shift awk '$0 ~ pattern { print FILENAME ":" $0 }' "pattern=$pattern" "$@"
या आप -v var=value आदेश पंक्ति विकल्प (जैसे awk -v pattern= $pattern ...) का उपयोग कर सकते हैं।
अंत में, यह शुद्ध एडब्ल्यूके में लिखा गया है, बिना सीप की मदद के या एडब्ल्यूके पटकथा के कार्यान्वयन के बारे में बहुत अधिक जानने की आवश्यकता के बिना (जैसा कि आदेश पंक्ति पर चर कार्य सौंपता है), लेकिन थोड़ा लंबा है: <वाक्यविन्यास लैंग = 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 }
</वाक्यविन्यास हाइलाइट> BEGIN
e> न केवल पहले तर्क को निकालने के लिए आवश्यक है, बल्कि इसे बाद में फ़ाइल नाम के रूप में व्याख्या किए जाने से रोकने के लिए भी आवश्यक है BEGIN
ब्लॉक समाप्त होता है। ARGC
, तर्कों की संख्या, हमेशा ≥1 होने की गारंटी है, जैसा कि ARGV[0]
आदेश का नाम है जो पटकथा को निष्पादित करता है, अक्सर तार "awk"
. यह भी ध्यान दें ARGV[ARGC]
खाली तार है, ""
. #
एक टिप्पणी आरंभ करता है जो पंक्ति के अंत तक विस्तृत होती है।
ध्यान दें if
खंड मैथा। एडब्ल्यूके केवल यह देखने के लिए जाँच करता है कि कमांड चलाने से पहले उसे मानक निविष्ट से पढ़ना चाहिए या नहीं। इस का मतलब है कि एडब्ल्यूके केवल इसलिए काम करता है क्योंकि यहाँ कोई फ़ाइल नाम नहीं है, केवल पहले जांचा गया है prog
चलाया गया है। कोई विवाद न हो इसलिए ARGC
से 1 को स्पष्ट रूप से स्थिर करते है ,और जब एडब्ल्यूके को लगता है कि यहाँ कोई और निविष्ट फाइल नहीं है तब वो उसे छोड़ देगा । इसलिए,आपको विशेष फ़ाइल नाम के साथ मानक निविष्ट से पढ़ने के लिए स्पष्ट रूप से कहने की आवश्यकता है -
.
Awk prog
स्व-निहित एडब्ल्यूके पटकथा
यूनिक्स जैसे स्वयं निहित संचालक तंत्र (यूनिक्स) सिंटैक्स का उपयोग करके एडब्ल्यूके पटकथा का निर्माण किया जा सकता है।
उदाहरण के लिए, एक पटकथा जो किसी फ़ाइल की सामग्री को छापती है,नाम की फ़ाइल बनाकर बनाई जा सकती है print.awk
निम्नलिखित सामग्री के साथ:
#!/usr/bin/awk -f { print $0 }
इसके साथ आह्वान किया जा सकता है: ./print.awk <filename>
-f
e> एडब्ल्यूके को बताता है कि एडब्ल्यूके प्रोग्राम को पढ़ने के लिए जो तर्क दिया गया है,वह फ़ाइल है,जो कि वही ध्वज है जिसका उपयोग sed में किया जाता है। चूंकि वे अक्सर एक पंक्तिय लिए उपयोग किए जाते हैं,ये दोनों प्रोग्राम एक अलग फाइल के बजाय आदेश पंक्ति तर्क के रूप में दिए गए प्रोग्राम को निष्पादित करने के लिए पूर्वनिर्धारित होते हैं।
संस्करण और कार्यान्वयन
एडब्ल्यूके मूल रूप से 1977 में लिखा गया था और संस्करण 7 यूनिक्स के साथ वितरित किया गया था।
1985 में इसके लेखकों ने भाषा का विस्तार करना शुरू किया, सबसे महत्वपूर्ण रूप से उपयोगकर्ता परिभाषित कार्यों को जोड़कर। 1988 में प्रकाशित पुस्तक द एडब्ल्यूके प्रोग्रामिंग लैंग्वेज में भाषा का वर्णन किया गया है, और इसका कार्यान्वयन यूनिक्स प्रणाली वी के प्रदर्शन में उपलब्ध कराया गया था। असंगत पुराने संस्करण के साथ भ्रम से बचने के लिए, इस संस्करण को कभी-कभी नया एडब्ल्यूके या नॉक कहा जाता था। यह कार्यान्वयन 1996 में एक मुफ्त सॉफ्टवेयर लाइसेंस के तहत जारी किया गया था और अभी भी ब्रायन कर्निघन द्वारा बनाए रखा गया है ।[citation needed]
यूनिक्स के पुराने संस्करण,जैसे यूनिक्स/32वी,शामिल हैं awkcc
,जिसने एडब्ल्यूके को C में बदल दिया। कर्निघन ने एडब्ल्यूके को C++ में बदलने के लिए एक प्रोग्राम लिखा; इसकी स्थिति ज्ञात नहीं है।[11]
- बीडब्लूके एडब्ल्यूके, जिसे nawk के नाम से भी जाना जाता है, ब्रायन कर्निघन के संस्करण को संदर्भित करता है। मूल रूप से भाषा का वर्णन करने वाली पुस्तक के साथ इस शब्द के उपयोग के कारण इसे वन ट्रू एडब्ल्यूके करार दिया गया है और तथ्य यह है कि कर्निघन एडब्ल्यूके के मूल लेखकों में से एक थे।[4] FreeBSD इस संस्करण को वन ट्रू ओक के रूप में संदर्भित करता है।[12] इस संस्करण में ऐसी विशेषताएं भी हैं जो पुस्तक में नहीं हैं, जैसे
tolower
तथाENVIRON
जिनकी व्याख्या ऊपर की गई है; विवरण के लिए स्रोत संग्रह में FIXES फ़ाइल देखें। इस संस्करण का उपयोग, उदाहरण के लिए, एंड्रॉयड (ऑपरेटिंग सिस्टम), FreeBSD, NetBSD, OpenBSD, macOS, और इलुमोस द्वारा किया जाता है। ब्रायन कर्निघन और अर्नोल्ड रॉबिंस, नॉक के लिए स्रोत रिपॉजिटरी में मुख्य योगदानकर्ता हैं: github.com /onetrueawk /awk. - (GNU एडब्ल्यूके) एक और फ्री-सॉफ्टवेयर कार्यान्वयन है और एकमात्र कार्यान्वयन है जो अंतर्राष्ट्रीयकरण और स्थानीयकरण और TCP/IP नेटवर्किंग को लागू करने में गंभीर प्रगति करता है। यह मूल कार्यान्वयन के स्वतंत्र रूप से उपलब्ध होने से पहले लिखा गया था। इसमें अपना स्वयं का डिबगर शामिल है, और इसकी प्रोफाइलिंग (कंप्यूटर प्रोग्रामिंग) उपयोगकर्ता को एक स्क्रिप्ट के लिए मापित प्रदर्शन संवर्द्धन करने में सक्षम बनाती है। यह उपयोगकर्ता को साझा पुस्तकालयों के साथ कार्यक्षमता बढ़ाने में भी सक्षम बनाता है। कुछ लिनक्स वितरणों में उनके पूर्वनिर्धारित एडब्ल्यूके कार्यान्वयन के रूप में गौक शामिल है।[citation needed]
- गॉक-सीएसवी। अल्पविराम से अलग किये गए मान विस्तार गॉक निविष्ट और उत्पादन सीएसवी स्वरूपित जानकारी को संभालने की सुविधा प्रदान करता है।[13]
- मॉक माइक ब्रेनन द्वारा बाईटकोड दुभाषिया पर आधारित एक बहुत तेज़ एडब्ल्यूके कार्यान्वयन है।
- libmawk mawk का एक फोर्क है, जो आवेदन को एडब्ल्यूके दुभाषियों के कई समानांतर उदाहरणों को अंतर्निहित करने की अनुमति देता है।
- एडब्ल्यूकेa (जिसका फ्रंट एंड mawk प्रोग्राम के ऊपर लिखा हुआ है) C कोड में एडब्ल्यूके पटकथा का एक और अनुवादक है जो संकलित किया जाता है, लेखक के libawka.a सहित सांख्यिकीय रूप से, परिणामी निष्पादनयोग्य काफी तेज हो जाते हैं और लेखक के परीक्षणों के अनुसार, एडब्ल्यूके,पर्ल, या Tcl के अन्य संस्करणों के साथ बहुत अच्छी तरह से तुलना करते हैं। छोटी पटकथा 160–170 kB के प्रोग्राम में बदल जाएँगी।
- टॉक (थॉम्पसन एडब्ल्यूके) सोलारिस (प्रचालन तंत्र), DOS, OS/2, और माइक्रोसॉफ्ट विंडोज के लिए एक एडब्ल्यूके संकलक है, जो पहले थॉम्पसन ऑटोमेशन सॉफ्टवेयर द्वारा बेचा जाता था (जिसने अपनी गतिविधियाँ बंद कर दी हैं)।[14]
- Jawk Java (प्रोग्रामिंग लैंग्वेज) में एडब्ल्यूके को लागू करने की एक परियोजना है, जिसे सोर्स फोर्ज पर होस्ट किया गया है।[15] एडब्ल्यूके पटकथा (यानी, जावा थ्रेड्स, सॉकेट्स, संग्रह, आदि) के भीतर जावा सुविधाओं तक पहुंच प्रदान करने के लिए भाषा में विस्तार जोड़े गए हैं।
- xगॉक गॉक का एक कांटा है[16] जो गतिशील रूप से लोड करने योग्य पुस्तकालयों के साथ गॉक का विस्तार करता है। XMLगॉक विस्तार को आधिकारिक GNU एडब्ल्यूके रिलीज़ 4.1.0 में एकीकृत किया गया था।
- 'QSEAWK' QSE लाइब्रेरी में शामिल एक एम्बेडेड एडब्ल्यूके दुभाषिया कार्यान्वयन है जो C (प्रोग्रामिंग भाषा) और C++ के लिए एम्बेडिंग अप्लिकेशन प्रोग्रामिंग अंतरफलक (API) प्रदान करता है।[17]
- libfawk सी में लिखा गया एक बहुत छोटा,केवल-फ़ंक्शन,रैत्रांत,व्यवस्था करने योग्य दुभाषिया है
- बिजीबॉक्स में दिमित्री ज़खारोव द्वारा लिखित एडब्ल्यूके कार्यान्वयन शामिल है। यह अंतर्निहित व्यवस्था के लिए उपयुक्त एक बहुत छोटा कार्यान्वयन है।
- माइकल पार्कर द्वारा CLAWK एक ही लेखक की नियमित अभिव्यक्ति लाइब्रेरी के आधार पर सामान्य लिस्प में एडब्ल्यूके कार्यान्वयन प्रदान करता है।[18]
किताबें
- अहो, अल्फ्रेड वी .; कर्निघन, ब्रायन डब्ल्यू .; वेनबर्गर, पीटर जे। (1988-01-01)। एडब्ल्यूके प्रोग्रामिंग लैंग्वेज । न्यूयॉर्क, एनवाई: एडिसन-वेस्ले । आईएसबीएन 0-201-07981-एक्स. 2017-01-22 को पुनःप्राप
- रॉबिन्स, अर्नोल्ड (2001-05-15)। प्रभावी एडब्ल्यूके प्रोग्रामिंग (तीसरा संस्करण)। सेबेस्टोपोल, सीए: ओ रेली मीडिया । आईएसबीएन 0-596-00070-7. 2009-04-16 को पुनःप्राप्त ।
- डौघर्टी, डेल ; रॉबिन्स, अर्नोल्ड (1997-03-01)। सेड और ऑक (दूसरा संस्करण)। सेबेस्टोपोल, सीए: ओ रेली मीडिया। आईएसबीएन 1-56592-225-5. 2009-04-16 को पुनःप्राप्त ।
- रॉबिन्स, अर्नोल्ड (2000)। प्रभावी एडब्ल्यूके प्रोग्रामिंग: Gnu एडब्ल्यूके के लिए उपयोगकर्ता की मार्गदर्शिका (1.0.3 संस्करण)। ब्लूमिंगटन, आईएन: आईयूनिवर्स । आईएसबीएन 0-595-10034-1. 12 अप्रैल 2009 को मूल से संग्रहीत । 2009-04-16 को पुनःप्राप्त ।
यह भी देखें
अग्रिम पठन
- एंडी ओरम (19 मई, 2021)। "ऑक: द पावर एंड प्रॉमिस ऑफ़ ए 40-ईयर-ओल्ड लैंग्वेज" । जीवाश्म । 9 जून, 2021 को पुनःप्राप्त ।
- हैमिल्टन, नाओमी (30 मई, 2008)। "प्रोग्रामिंग भाषाओं का AZ: एडब्ल्यूके" । कंप्यूटरवर्ल्ड । 2008-12-12 को पुनःप्राप्त । - एडब्ल्यूके पर अल्फ्रेड वी. अहो के साथ साक्षात्कार
- रॉबिंस, डेनियल (2000-12-01)। "एडब्ल्यूके by example, भाग 1: अजीब नाम के साथ महान भाषा का परिचय" । सामान्य धागे । आईबीएम डेवलपर वर्क्स । 2009-04-16 को पुनःप्राप्त ।
- रॉबिन्स, डैनियल (2001-01-01)। "एडब्ल्यूके by example, Part 2: Records, Loops, and arrays" । सामान्य धागे । आईबीएम डेवलपर वर्क्स । 2009-04-16 को पुनःप्राप्त ।
- रॉबिन्स, डैनियल (2001-04-01)। "एडब्ल्यूके by example, Part 3: String functions and ... checkbooks?" . सामान्य धागे । आईबीएम डेवलपर वर्क्स। 19 मई 2009 को मूल से संग्रहीत । 2009-04-16 को पुनःप्राप्त ।
- एडब्ल्यूके - 60 मिनट में विशेषज्ञ बनें
- एडब्ल्यूके: पैटर्न स्कैनिंग और प्रोसेसिंग लैंग्वेज - शेल और यूटिलिटीज रेफरेंस, द सिंगल यूनिक्स स्पेसिफिकेशन , ओपन ग्रुप से वर्जन 4
- गॉक(1) - लिनक्स यूजर मैनुअल - यूजर कमांड्स
References
- ↑ 1.0 1.1 James W. Livingston (May 2, 1988). "ग्रेट ऑक प्रोग्राम नो बर्डब्रेन है". Digital Review. p. 91.
- ↑ Raymond, Eric S. "Applying Minilanguages". The Art of Unix Programming. Case Study: awk. Archived from the original on July 30, 2008. Retrieved May 11, 2010.
The awk action language is Turing-complete, and can read and write files.
- ↑ Aho, Alfred V.; Kernighan, Brian W.; Weinberger, Peter J. (September 1, 1978). Awk - एक पैटर्न स्कैनिंग और प्रोसेसिंग लैंग्वेज (दूसरा संस्करण) (Technical report). Unix Seventh Edition Manual, Volume 2. Bell Telephone Laboratories, Inc. Retrieved February 1, 2020.
- ↑ 4.0 4.1 Aho, Alfred V.; Kernighan, Brian W.; Weinberger, Peter J. (1988). AWK प्रोग्रामिंग लैंग्वेज. Addison-Wesley Publishing Company. ISBN 9780201079814. Retrieved 16 May 2015.
- ↑ "UNIX विशेष: प्रोफेसर कर्निघन और ब्रिल्सफ़ोर्ड". Computerphile. September 30, 2015. Archived from the original on 2021-11-22.
- ↑ "एकल यूनिक्स विशिष्टता, संस्करण 3, यूटिलिटीज इंटरफेस टेबल". Archived from the original on 2018-01-05. Retrieved 2005-12-18.
- ↑ "Chapter 15. Commands and Utilities". लिनक्स मानक आधार कोर विशिष्टता 4.0 (Technical report). Linux Foundation. 2008. Archived from the original on 2019-10-16. Retrieved 2020-02-01.
- ↑ 8.0 8.1 8.2 Robbins, Arnold (March 2014). "GNU प्रोजेक्ट और मैं: GNU AWK के साथ 27 साल" (PDF). skeeve.com. Archived (PDF) from the original on October 6, 2014. Retrieved October 4, 2014.
- ↑ Dougherty, Dale; Robbins, Arnold (1997). मास्टर और ओक (2nd ed.). Sebastopol, CA: O'Reilly. p. 221. ISBN 1-565-92225-5.
- ↑ 10.0 10.1 "रिकॉर्ड्स (GNU Awk यूजर गाइड)". Archived from the original on 2020-06-14. Retrieved 2020-05-23.
- ↑ Kernighan, Brian W. (April 24–25, 1991). AWK से C++ अनुवादक (PDF). Usenix C++ Conference. Washington, DC. pp. 217–228. Archived (PDF) from the original on 2020-06-22. Retrieved 2020-02-01.
- ↑ "AWK awk को FreeBSD कोर में आयात करने के लिए FreeBSD कार्य लॉग". May 16, 2005. Archived from the original on September 8, 2013. Retrieved September 20, 2006.
- ↑ gawk-csv documentation at http://gawkextlib.sourceforge.net/csv/gawk-csv.html Archived 2020-03-25 at the Wayback Machine
- ↑ James K. Lawless (May 1, 1997). "TAWK कंपाइलर की जांच". Dr. Dobb's Journal. Archived from the original on February 21, 2020. Retrieved February 21, 2020.
- ↑ "SourceForge पर जॉक". Archived from the original on 2007-05-27. Retrieved 2006-08-23.
- ↑ "xgawk होम पेज". Archived from the original on 2013-04-18. Retrieved 2013-05-07.
- ↑ "GitHub पर QSEAWK". GitHub. Archived from the original on 2018-06-11. Retrieved 2017-09-06.
- ↑ "गिटहब पर CLAWK". GitHub. Archived from the original on 2021-08-25. Retrieved 2021-06-01.
बाहरी संबंध
- The Amazing Awk Assembler by Henry Spencer.
- AWK at Curlie
- awklang.org The site for things related to the awk language