सच्ची और झूठी स्थिति की जागृति


9

मुझे पता चला कि यदि हम उपयोग करते हैं awk 0 inputfile, तो यह किसी भी कारण को नहीं छापेगा, 0जिसका अर्थ है कि स्थिति का गलत होना।

यदि हम उपयोग करते हैं awk 1 inputfile, तो यह 1प्रत्येक पंक्ति के लिए हर चीज को प्रिंट करेगा जैसा कि प्रत्येक पंक्ति में व्याख्या है।

यदि हम उपयोग करते हैं awk any_string inputfile, तो यह कुछ भी प्रिंट नहीं करेगा क्योंकि सभी awk वैरिएबल को शून्य के रूप में इनिशियलाइज़ किया जाता है।

लेकिन अगर हम उपयोग करते हैं awk any_integer inputfile, तो यह सच हो जाएगा और फ़ाइल की प्रत्येक पंक्ति को प्रिंट करेगा, क्या मुझे पता है कि इसका कारण क्या है?

मुझे नहीं पता कि यह GNU awkमैनुअल में समझाया गया है ।


3
द्वारा any_integerमैं आप की तरह मतलब शाब्दिक संख्या लगता है 7, 89आदि .. यदि हां, तो कारण से किसी भी संख्या अन्य है 0साधन trueहालत
संदीप

जवाबों:


13

Awk के लिए सही या तो एक गैर-रिक्त स्ट्रिंग या एक गैर-शून्य संख्या है (संख्या दशमलव पूर्णांक या फ्लोटिंग बिंदु होने के साथ और कुछ awk कार्यान्वयन के साथ हेक्साडेसिमल या ऑक्टल के रूप में अच्छी तरह से समर्थित हैं)। दोहरे उद्धरण चिह्नों में बताई गई बातें स्ट्रिंग हैं, निर्विवाद रूप से शाब्दिक संख्याएं हैं, लेकिन किसी और चीज के लिए, यह निर्धारित करने के लिए जटिल नियम हैं कि क्या कुछ को एक स्ट्रिंग या संख्या के रूप में माना जाना है। GNU awkमैनुअल में उस पर एक पूरा अध्याय है

सच:

  • awk '1' (गैर शून्य संख्या)
  • awk '1e8' (गैर शून्य संख्या)
  • awk '-0.01' (गैर शून्य संख्या)
  • awk '"foo"' (गैर-खाली स्ट्रिंग)
  • awk '"0"' (गैर-खाली स्ट्रिंग)
  • awk '0 ""' (कॉनटैनेशन से एक स्ट्रिंग निकलती है जो यहां न के बराबर है)
  • echo 0 | awk '$1 ""' (एक $ n क्षेत्र के लिए समान)
  • awk 'substr("000", 1, 1)'(परिणाम substr()हमेशा एक स्ट्रिंग होता है)
  • echo '0foo' | awk '$0' ($ 0 एक गैर-संख्यात्मक स्ट्रिंग है इसलिए इसे स्ट्रिंग (गैर-खाली) माना जाता है)

असत्य:

  • awk '0' (0 नंबर)
  • awk '""' (खाली स्ट्रिंग)
  • echo 0000e123 | awk '$1' ($ 1 को एक संख्या माना जाता है यदि यह एक संख्यात्मक स्ट्रिंग है जो यह यहाँ है और 0 है)
  • echo ' 0 ' | awk '$0' (यदि स्ट्रिंग एक संख्यात्मक है, तो यह निर्धारित करने के लिए अग्रणी और अनुगामी रिक्त स्थान की अनदेखी की जाती है)।
  • awk '" 2foo" - 2' (एक अंकगणितीय अभिव्यक्ति में शामिल एक स्ट्रिंग को एक संख्या में बदल दिया जाता है जिसमें कुछ भी संख्या को अनदेखा किया जाता है)
  • awk 'unset_or_empty_variable' (खाली स्ट्रिंग)
  • awk '"non-numerical-string" + 0'

YMMV:

  • awk '1e-500' (कुछ शिकायत करेंगे, कुछ इसे 0 मानेंगे)
  • awk '"0x1" + 0'(सभी awk कार्यान्वयन हेक्साडेसिमल का समर्थन नहीं करते हैं, उन पर जो दूसरों में "0x1"परिवर्तित हो जाते हैं 1, दूसरों में 0। POSIX विनिर्देश के कुछ संस्करण को उस हेक्स संख्या का समर्थन करने के लिए अनजाने में आवश्यक कार्यान्वयन की आवश्यकता होती है और इसे बाद में वापस ले लिया गया है। फिर भी gawkउस हेक्स संख्या को पहचानने POSIXLY_CORRECTमें है। पर्यावरण)
  • awk '010 - 8' (अष्टक के लिए समान (010 के रूप में अच्छी तरह से यहाँ शाब्दिक रूप से स्ट्रिंग से परिवर्तित होने के विपरीत नहीं है)
  • awk '0x1 - 1'( awkहेक्स संख्याओं का समर्थन नहीं करने वाले कार्यान्वयन पर , 0x1वह परिवर्तन है 0और वह x1चर जो पैदावार "0"को एक संख्या (0) में बदल देता है, यदि आप घटाते हैं 1तो आपको वह मिलता है -1जो गैर-शून्य संख्या है)।

इसका मतलब यह है कि यदि आप जांच करना चाहते हैं कि क्या कोई स्ट्रिंग गैर-रिक्त है, तो आपको ऐसा नहीं करना चाहिए:

awk '$ 1 {प्रिंट $ 1, "खाली नहीं है"} "

परंतु

awk '$1 != "" {print $1, "is not empty"}'

अन्यथा यह नहीं कहेगा 0या -0000E+00001234गैर-रिक्त हैं।


प्रभावशाली और विस्तार से जवाब! हालांकि एक सवाल: आपने जो अंतिम उदाहरण दिया, उसमें मैंने सिंटैक्स की कोशिश की थी और पहला काम करता है, जहां यह $ 1 को छोड़ देता है जो खाली है और केवल $ 1 गैर खाली के साथ उन रेखाओं को प्रिंट करता है, क्योंकि अगर $ 1 खाली स्ट्रिंग है तो यह होगा गलत है, और इस प्रकार आउटपुट को प्रिंट नहीं करना है, है ना?
sylye 5
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.