AWK: स्टड के लिए $ (बिल्ली) काम क्यों करता है, लेकिन $ * नहीं करता है?


9
echo '((3+(2^3)) * 34^2 / 9)-75.89' | awk "BEGIN{ print $(cat) }"

उपरोक्त सिंटैक्स गणना परिणाम synt 1337 ’के साथ ठीक काम करता है।

echo '((3+(2^3)) * 34^2 / 9)-75.89' | awk "BEGIN{ print $* }"

लेकिन उपरोक्त सिंटैक्स काम नहीं करता है, हालांकि कोई त्रुटि नहीं है।

Plz सलाह।

जवाबों:


13

$(command)वाक्य रचना के उत्पादन में वापस आ जाएगी command। यहां, आप बहुत ही सरल catप्रोग्राम का उपयोग कर रहे हैं जिसका एकमात्र काम मानक इनपुट (स्टड) से मानक आउटपुट (स्टडआउट) में सब कुछ कॉपी करना है। जब से तुम चल रहे हैं awkदोहरे उद्धरण चिह्नों के अंदर स्क्रिप्ट, $(cat)खोल से विस्तार किया जाता है से पहलेawk , स्क्रिप्ट चलाया जाता है तो इसे पढ़ता echoअपने stdin और विधिवत इसे अपनी stdout के लिए प्रतियों में उत्पादन। इसे फिर awkस्क्रिप्ट में पास कर दिया जाता है । आप इसे कार्रवाई में देख सकते हैं set -x:

$ set -x
$ echo '((3+(2^3)) * 34^2 / 9)-75.89' | awk "BEGIN{ print $(cat) }"
+ echo '((3+(2^3)) * 34^2 / 9)-75.89'
++ cat
+ awk 'BEGIN{ print ((3+(2^3)) * 34^2 / 9)-75.89 }'
1337

तो, awkवास्तव में चल रहा है BEGIN{ print ((3+(2^3)) * 34^2 / 9)-75.89 }'जो 1337 देता है।

अब, $*एक विशेष शेल वैरिएबल है, जो शेल स्क्रिप्ट (देखें man bash) को दिए गए सभी स्थितीय मापदंडों को विस्तार देता है :

   *      Expands to the positional parameters, starting from one.  When the expan
          sion  is not within double quotes, each positional parameter expands to a
          separate word.  In contexts where it is performed, those words  are  sub
          ject  to  further word splitting and pathname expansion.  When the expan
          sion occurs within double quotes, it expands to a single  word  with  the
          value  of each parameter separated by the first character of the IFS spe
          cial variable.  That is, "$*" is equivalent to "$1c$2c...",  where  c  is
          the  first  character of the value of the IFS variable.  If IFS is unset,
          the parameters are separated by spaces.  If IFS is null,  the  parameters
          are joined without intervening separators.

हालाँकि, यह चर यहाँ खाली है। इसलिए, awkस्क्रिप्ट बन जाती है:

$ echo '((3+(2^3)) * 34^2 / 9)-75.89' | awk "BEGIN{ print $* }"
+ awk 'BEGIN{ print  }'
+ echo '((3+(2^3)) * 34^2 / 9)-75.89'

$*एक रिक्त स्ट्रिंग पर फैलता है, और awkएक खाली स्ट्रिंग मुद्रित करने के लिए कहा है, और यही कारण है कि आप कोई उत्पादन मिलता है।


आप bcइसके बजाय सिर्फ उपयोग करना चाहते हैं :

$ echo '((3+(2^3)) * 34^2 / 9)-75.89' | bc
1336.11

शायद का उपयोग करना चाहिए bc -l, अन्यथा आप ऊपर पोस्ट की गई विसंगति को प्राप्त करेंगे (जहां विभाजन का परिणाम छोटा हो गया है)।
cumbuckley

@ कुंबले मैं 1337 को प्रिंट करने की कोशिश कर रहा था, साथ में खेलकर scale=(मुझे लगता है कि ओपी लेट्सपेक के साथ खेलना चाहता है) लेकिन मुझे कोई रास्ता नहीं मिला। मेरे सिस्टम पर bc -lलौटता 1336.99888888888888888888है।
टेराडन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.