खोज…
कमांड-लाइन चर असाइनमेंट
कमांड-लाइन से चर असाइन करने के लिए, -v का उपयोग किया जा सकता है:
$ awk -v myvar="hello" 'BEGIN {print myvar}'
hello
ध्यान दें कि समान चिह्न के आसपास रिक्त स्थान नहीं हैं।
यह शेल चरों का उपयोग करने की अनुमति देता है:
$ shell_var="hello"
$ awk -v myvar="$shell_var" 'BEGIN {print myvar}'
hello
इसके अलावा, इस सेट में निर्मित है कि नियंत्रण चर के लिए अनुमति देता awk :
FS (क्षेत्र विभाजक) के साथ एक उदाहरण देखें:
$ cat file
1,2;3,4
$ awk -v FS="," '{print $2}' file
2;3
$ awk -v FS=";" '{print $2}' file
3,4
या OFS (आउटपुट फील्ड सेपरेटर) के साथ:
$ echo "2 3" | awk -v OFS="--" '{print $1, $2}'
2--3
$ echo "2 3" | awk -v OFS="+" '{print $1, $2}'
2+3
-V विकल्प का उपयोग करके किसी प्रोग्राम में पैरामीटर पास करना
विकल्प -v फॉर्म चर के मान के बाद = मान का उपयोग किसी अनचाहे प्रोग्राम में पैरामीटर पास करने के लिए किया जा सकता है। यह नीचे दिए गए दंड कार्यक्रम, जिनका काम लिखने गिनती बार सजा के लिए है के रूप में रेखांकित किया गया है "मैं कक्षा में बात नहीं करेगा।" मानक उत्पादन पर। निम्न उदाहरण मान 100 का उपयोग करता है, जो शिक्षकों के बीच बहुत लोकप्रिय है:
awk -v count=100 'BEGIN {
for(i = 1; i <= count; ++i) {
print("I shall not talk in class.")
}
exit
}'
-v ध्वज के बार-बार उपयोग के साथ कई मापदंडों को पारित करना संभव है:
awk -v count=100 -v "sentence=I shall not talk in class." 'BEGIN {
for(i = 1; i <= count; ++i) {
print(sentence)
}
exit
}'
सरणी या सूची मापदंडों के लिए कोई अंतर्निहित समर्थन नहीं है, इन्हें मैन्युअल रूप से संभालना होगा। सूची पैरामीटर पास करने के लिए एक शास्त्रीय दृष्टिकोण एक सीमांकक का उपयोग करके सूची को संक्षिप्त करना है, लोकप्रिय विकल्प हैं : ,, | या , । स्प्लिट फंक्शन फिर लिस्ट को एक अर्क ऐरे के रूप में रिकवर करने की अनुमति देता है:
awk -v 'serialised_list=a:b:c:d:e:f' 'BEGIN {
list_sz = split(serialised_list, list, ":")
for(i = 1; i <= list_sz; ++i) {
printf("list: %d: %s\n", i, list[i])
}
exit
}'
इस awk प्रोग्राम का आउटपुट है
list: 1: a
list: 2: b
list: 3: c
list: 4: d
list: 5: e
list: 6: f
कभी-कभी यह लिस्ट आइटम्स को रिकर्व सरणी की कुंजियों के रूप में पुनर्प्राप्त करने के लिए अधिक सुविधाजनक होता है, क्योंकि इससे आसान सदस्यता सत्यापन की अनुमति मिलती है। उदाहरण के लिए, निम्न प्रोग्राम प्रत्येक पंक्ति को प्रिंट करता है जिसका पहला शब्द अपवादों की निश्चित सूची से संबंधित नहीं है:
awk -v 'serialised_exception_list=apple:pear:cherry' 'BEGIN {
_list_sz = split(serialised_exception_list, _list, ":")
for(i = 1; i <= _list_sz; ++i) {
exception[_list[i]]
}
}
! ($1 in exception) { print }' <<EOF
apple Apples are yummy, I like them.
pineapple Do you like pineapple?
EOF
इस कार्यक्रम का आउटपुट है
pineapple Do you like pineapple?
एक अंतिम उदाहरण के रूप में, हम दिखाते हैं कि सजा कार्यक्रम को एक शेल स्क्रिप्ट में कैसे लपेटना है, क्योंकि यह दिखाता है कि कैसे एक शेल स्क्रिप्ट एक सहायक awk स्क्रिप्ट में मापदंडों को बताती है:
#!/bin/sh
usage()
{
cat <<EOF
Usage: punishment [-c COUNT][-s SENTENCE]
Prepare your punishments for you
EOF
}
punishment_count='100'
punishment_sentence='I shall not talk in class.'
while getopts "c:hs:" OPTION; do
case "${OPTION}" in
c) punishment_count="${OPTARG}";;
s) punishment_sentence="${OPTARG}";;
h) usage; exit 0;;
*) usage; exit 64;;
esac
done
awk -v "count=${punishment_count}" -v "sentence=${punishment_sentence}" 'BEGIN {
for(i = 1; i <= count; ++i) {
print(sentence)
}
exit
}'
स्थानीय चर
Awk भाषा सीधे कार्यों के लिए स्थानीय चर का समर्थन नहीं करती है। हालांकि कार्यों में अतिरिक्त तर्क जोड़कर उनका अनुकरण करना आसान है। यह इंगित करने के लिए कि वे वास्तविक पैरामीटर नहीं हैं, इन वेरिएबल्स को _ द्वारा उपसर्ग करना पारंपरिक है।
हम इस तकनीक को एक single_quote फ़ंक्शन की परिभाषा के साथ single_quote करते हैं जो एक स्ट्रिंग के चारों ओर एकल उद्धरण जोड़ता है:
# single_quote(TEXT)
# Return a string made of TEXT surrounded by single quotes
function single_quote(text, _quote) {
_quote = sprintf("%c", 39)
return sprintf("%s%s%s", _quote, text, _quote);
}
sprintf("'%s'", text) का उपयोग करने का सरल तरीका sprintf("'%s'", text) व्यावहारिक समस्याओं की ओर जाता है क्योंकि awk लिपियों को आमतौर पर awk प्रोग्राम में एकल उद्धृत तर्कों के रूप में पारित किया जाता है।
असाइनमेंट तर्क
असाइनमेंट आर्ग्युमेंट्स एक awk इनवोकेशन के अंत में दिखाई देते हैं, उसी क्षेत्र में फ़ाइल चर के रूप में, दोनों -v असाइनमेंट और तर्क असाइनमेंट निम्न नियमित अभिव्यक्ति से मेल खाना चाहिए। (POSIX लोकेल मानकर)
^[[:alpha:]_][[:alnum:]_]*=
निम्न उदाहरण एक फ़ाइल मान लिया गया file निम्नलिखित युक्त 1 2 3 (सफेद स्पेस द्वारा पृथक)
$ awk '{$1=$1}1' file OFS=, file OFS=- file
1 2 3
1,2,3
1-2-3