awkが空でない文字列と正数を印刷するのはなぜですか?

awkが空でない文字列と正数を印刷するのはなぜですか?

印刷の代わりに使用するいくつかの例を見つけましたawk(例:1print$0スペースを節約するために、私は通常「1」を使用します。。そしてこのウェブサイトから)。

これは文書化されているか安全な慣行ですか、それとも一部のバージョンで壊れる可能性がありますか?

ここにいくつかの例があります。

echo 'a-does-print-$0' | awk '"x"'    
echo 'b-does-print-$0' | awk '$0'   
echo 'c-does-print-$0' | awk '1'
echo 'd-does-print-$0' | awk '(1-2)'  
echo 'd-does-print-$0' | awk '{$0="abc"}1'  

echo 'nothing-prints' | awk '{$0="abc"}'  
echo 'nothing-prints' | awk '$999' 
echo 'nothing-prints' | awk '(1-1)'  
echo 'nothing-prints' | awk '1-1' 
echo 'nothing-prints' | awk '0' 
echo 'nothing-prints' | awk 'unsetVar' 
echo 'nothing-printw' | awk ''

echo 'crashes' | awk '-3.14159'
echo 'crashes' | awk '-2' 
echo 'crashes' | awk '-1'

答え1

だから...プログラムの形式はawk一連のEXPRESSION { ACTION }文です。そのACTION部分を省略すると、すべての内容が一致すると想定されprintます。EXPRESSIONこれにより、すべての内容が印刷されます。

awk 1

あなたの式(1)が「true」と評価されているからです(そしてあなたは何もしませんでした)。これはすべての「x-does-print」の例に当てはまります。例の入力が与えられると、すべてゼロではなく、nullではなくEXPRESSIONnoがあるためですACTION。空の入力行が与えられると、$02番目の例では何も出力されません。

同様に、最初のもの以外の「印刷なし」の例の式は、「false」(空の文字列または数字0)として評価されます。この{$0="abc"}例は異なる動作をします。印刷指示がないので何も印刷しません。少なくとも999のフィールドを含む長い入力線が与えられた場合、2番目の例($999)は実際にその行を印刷します。

これが仕組みの基本ですawk。したがって、確実に文書化されており、破損することはありません。

「衝突」の例は実際には衝突しないことに注意してください。私はシェル構文に基本的な間違いをしました。 awkは先頭の引数を-コマンドラインオプションとして解釈します。引用しても何の変化もありません。このように awk 負の数を渡すには、awk プログラムにプレフィックスを付けて--awk にオプションの処理を停止する必要があることを示す必要があります。

echo 'crashes' | awk -- -3.14159

-3.14150空の文字列でも数字もゼロでもないため、「クラッシュ」を印刷します。

答え2

~からGNUawkマニュアル:

多くのプログラミング言語には、「真」と「偽」の概念の特別な表現があります。これらの言語は通常、特殊定数trueとfalseを使用するか、対応する大文字を使用します。しかし、awkは異なります。これはCで真と偽の非常に単純な概念を借りた。 awk では、ゼロ以外の数値または空でない文字列値の両方が true です。他の値(0または空の文字列 "")はfalseです。

はい、この使用法は移植可能であり、将来的に使用することができます。

参考までに、これは2番目の例を示しています。

echo 'b-does-print-$0' | awk '$0'  

印刷されないすべて行、awkが実際の文字列として解釈する行、つまり空の行または数字0(、、、、、0... )のみを含む作成された行。000.0e3-.0

関連情報