लिनक्स में Awk के साथ अगले कमांड का उपयोग कैसे करें - भाग 6


Awk श्रृंखला के इस छठे भाग में, हम next कमांड का उपयोग करते हुए देखेंगे, जो Awk को आपके द्वारा प्रदान किए गए सभी शेष पैटर्न और अभिव्यक्तियों को छोड़ने के लिए कहता है, लेकिन इसके बजाय अगली इनपुट लाइन पढ़ें।

next कमांड आपको निष्पादित करने से रोकने में मदद करता है कि मैं कमांड निष्पादन में समय बर्बाद करने वाले चरणों के रूप में क्या संदर्भित करूंगा।

यह कैसे काम करता है, इसे समझने के लिए, हम food_list.txt नामक एक फाइल पर विचार करते हैं जो इस तरह दिखाई देती है:

No      Item_Name               Price           Quantity
1       Mangoes                 $3.45              5
2       Apples                  $2.45              25
3       Pineapples              $4.45              55
4       Tomatoes                $3.45              25
5       Onions                  $1.45              15
6       Bananas                 $3.45              30

निम्नलिखित आदेश को चलाने पर विचार करें जो खाद्य पदार्थों को चिह्नित करेंगे जिनकी मात्रा प्रत्येक पंक्ति के अंत में <कोड> (*) के साथ 20 से कम या बराबर है:

# awk '$4 <= 20 { printf "%s\t%s\n", $0,"*" ; } $4 > 20 { print $0 ;} ' food_list.txt 

No	Item_Name		Price		Quantity
1	Mangoes			$3.45		   5	*
2	Apples			$2.45              25
3	Pineapples		$4.45              55
4	Tomatoes		$3.45              25 
5	Onions			$1.45              15	*
6	Bananas	                $3.45              30

उपरोक्त आदेश वास्तव में निम्नानुसार काम करता है:

  1. सबसे पहले, यह जांचता है कि क्या प्रत्येक इनपुट लाइन का चौथा क्षेत्र, 20 से कम या उसके बराबर है, यदि कोई मान उस स्थिति से मिलता है, तो उसे मुद्रित किया जाता है और (*) साइन के साथ चिह्नित किया जाता है अंत में एक का उपयोग करके: $4 <= 20
  2. दूसरी बात, यह जाँचता है कि प्रत्येक इनपुट लाइन का चौथा क्षेत्र 20 से अधिक है या नहीं, और यदि कोई रेखा उस स्थिति को पूरा करती है जो अभिव्यक्ति दो का उपयोग करके मुद्रित हो जाती है: $4> 20

लेकिन यहां एक समस्या है, जब पहली अभिव्यक्ति निष्पादित की जाती है, तो एक पंक्ति जिसे हम ध्वज लगाना चाहते हैं, का उपयोग करके मुद्रित किया जाता है: {printf "% s\t% s\n", $0, "**"; } और फिर उसी चरण में, दूसरी अभिव्यक्ति की भी जाँच की जाती है जो समय बर्बाद करने वाला कारक बन जाता है।

इसलिए पहले अभिव्यक्ति को मुद्रित करने वाली लाइनों को पहले से ही मुद्रित करने के बाद दूसरी अभिव्यक्ति, $4> 20 को निष्पादित करने की आवश्यकता नहीं है।

इस समस्या से निपटने के लिए, आपको next कमांड का उपयोग इस प्रकार करना होगा:

# awk '$4 <= 20 { printf "%s\t%s\n", $0,"*" ; next; } $4 > 20 { print $0 ;} ' food_list.txt

No	Item_Name		Price		Quantity
1	Mangoes			$3.45		   5	*
2	Apples			$2.45              25
3	Pineapples		$4.45              55
4	Tomatoes		$3.45              25 
5	Onions			$1.45              15	*
6	Bananas	                $3.45              30

एक इनपुट लाइन के बाद $4 <= 20 {printf "% s\t% s\n", $0, "*" का उपयोग करके मुद्रित किया जाता है; अगला ; } , next कमांड शामिल दूसरी अभिव्यक्ति को छोड़ने में मदद करेगा $4> 20 {print $0;} , इसलिए निष्पादन को जाता है; अगली इनपुट लाइन की जाँच किए बिना समय बर्बाद करने के लिए कि क्या मात्रा 20 से अधिक है।

अगला कमांड बहुत महत्वपूर्ण है कुशल कमांड लिखना और जहां आवश्यक हो, आप हमेशा स्क्रिप्ट के निष्पादन को गति देने के लिए उपयोग कर सकते हैं। श्रृंखला के अगले भाग के लिए तैयार करें जहाँ हम मानक इनपुट (STDIN) का उपयोग करके Awk के इनपुट के रूप में देखेंगे।

आशा है कि आपको यह मददगार साबित होगा।