सशर्त ब्लॉक बनाम सशर्त बयान (यदि)


18

कहो कि मेरे पास एक फाइल है:

PRO 1
GLN 5.55112e-17
ILE -6.245e-17
THR 5.55112e-17

मैं चाहता हूं कि हर पंक्ति में एक संख्या असमान हो जो दूसरे कॉलम में 1 से 0 में बदल जाए और बाकी को रख ले।

अगर मैं if(सशर्त बयान) का उपयोग करता हूं , तो सब कुछ ठीक है

awk '{if($2!=1){print $1,"0"}else{print $0}}' file
PRO 1
GLN 0
ILE 0
THR 0

लेकिन जब मैं सशर्त ब्लॉक का उपयोग करता हूं, तो कुछ अवांछित होता है:

awk '$2!=1 {print $1,"0"} {print $0}' file
PRO 1
GLN 0
GLN 5.55112e-17
ILE 0
ILE -6.245e-17
THR 0
THR 5.55112e-17

आप देख सकते हैं कि क्या गलत है।

  • मैं इस त्रुटि को कैसे ठीक करूं?
  • यह त्रुटि क्यों होती है?
  • सशर्त विवरण और सशर्त ब्लॉक के बीच क्या अंतर है?

जवाबों:


26

एक ifबयान में, आप एक else। अगर ifमेल नहीं खाता है,else शाखा निष्पादित हो जाती है।

एक सशर्त बयान में, दोनों कार्रवाई निष्पादित की जाती हैं, भले ही स्थिति सही या गलत हो।

एक साधारण तय:

$ awk '$2!=1 {print $1,"0";next};{print $0}' file
PRO 1
GLN 0
ILE 0
THR 0

और आप इसे और अधिक संक्षिप्त कर सकते हैं:

$ awk '$2 != 1 {print $1,"0";next};1' file
PRO 1
GLN 0
ILE 0
THR 0

जब स्थिति सही होती है 1और कोई कार्रवाई नहीं होती है, तो awkडिफ़ॉल्ट व्यवहार होता है printprintबिना किसी तर्क के $0डिफ़ॉल्ट रूप से प्रिंट होगा ।


4
आप इसे गोल्फ में भी डाल सकते हैं awk '$2!=1?$2=0:"";1' file
terdon

@terdon: अच्छी गोल्फिंग। मुझे लगता है कि ओपी को यह समझना मुश्किल हो सकता है।
कॉउन्गलम

1
@ cuonglm आप की भूमिका स्पष्ट कर सकते हैं next। मुझे लगता है कि यह दूसरा प्रिंट दबाता है अगर पहला सच है। की तरह कुछ continueमें C
अलेक्जेंडर सेस्का

@Alexander Cska: nextवर्तमान इनपुट लाइन को दबाता है, अगले एक पर जाएं। के रूप में एक ही भूमिका while, लेकिन पूरे awkकार्यक्रम के लिए। इसके अलावा, awkअपना स्वयं का हैwhile
cuonglm

10

में दूसरा ब्लॉक

awk '$2!=1 {print $1,"0"} {print $0}' file

सशर्त नहीं है। यह हर लाइन के लिए काम करता है, और इस तरह हर लाइन को प्रिंट करता है।

इसके बजाय, लिखें:

awk '$2!=1 {print $1,"0"} $2==1 {print $0}' file

या लिखें:

awk '$2!=1 {print $1,"0"; next} {print $0}' file

इससे बिना शर्त ब्लॉक को छोड़ दिया जाएगा, अगर सशर्त ब्लॉक का मिलान किया जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.