जवाबों:
एक awkकार्यक्रम हालत-एक्शन जोड़े की एक श्रृंखला है, घुंघराले ब्रेस के बाहर स्थितियां और उनमें संलग्न होने वाली क्रियाएं। एक शर्त को झूठा माना जाता है यदि यह शून्य या खाली स्ट्रिंग का मूल्यांकन करता है, तो कुछ भी सही है (संदर्भ के आधार पर, अनइंस्टॉल किए गए चर शून्य या खाली स्ट्रिंग हैं, इसलिए वे झूठे हैं)। या तो एक शर्त या एक कार्रवाई निहित हो सकती है; बिना किसी शर्त के ब्रेसिज़ (जैसा कि आपका शुरू होता है) को एक सच्ची स्थिति माना जाता है और हमेशा मार डाला जाता है अगर वे हिट हो जाते हैं, और बिना किसी शर्त के लाइन को प्रिंट करेंगे यदि और केवल तभी शर्त पूरी होती है।
1तो यह हर पंक्ति के लिए डिफ़ॉल्ट क्रिया निष्पादित करता है, लाइन (जो कोष्ठकों में पिछली कार्रवाई के द्वारा संशोधित किया जा सकता है) मुद्रण अपनी स्क्रिप्ट के अंत में, एक शर्त (हमेशा सच) कोई कार्रवाई नहीं की है।
मैं वास्तव में इस प्रकार के शॉर्टकटों को नापसंद करता हूं क्योंकि यह बाधा डालता है और भ्रमित करता है कि यह कैसे पार्स किया जा रहा है। जब आप ऐसा कुछ पढ़ते हैं awk -F"=" '{OFS="=";gsub(",",";",$2)}1', तो आप सोच सकते हैं कि 1पिछले कथन को संशोधित कर रहा है। या आप सोच सकते हैं कि इसके 1लिए एक उपनाम है {print}, जो तकनीकी रूप से सही नहीं है।
वास्तव में, 1एक पूरी तरह से अलग बयान है। आप इस तरह से बयानों को अलग कर सकते हैं:
awk -F"=" '
{OFS="="; gsub(",",";",$2)}
1
'
प्रत्येक awk स्टेटमेंट फॉर्मेट है condition {action}। यदि कोई नहीं {action}दिया गया है, तो डिफ़ॉल्ट कार्रवाई है {print}। (यदि कोई नहीं conditionदिया गया है, तो डिफ़ॉल्ट स्थिति है true)
तो यहाँ, 1वह स्थिति है, जो हमेशा मूल्यांकन करती है trueक्योंकि यह नॉनज़रो है। actionछोड़ दिया जाता है, ताकि डिफ़ॉल्ट {print}किया जाता है। आप इसे इस तरह से सोच सकते हैं:
awk -F"=" '
{OFS="="; gsub(",",";",$2)}
1!=0 {print}
'
awk -F"=" '{OFS="=";gsub(",",";",$2)}{print}'