を使用すると、条件が偽でawk 0 inputfile
あるため、何も印刷されないことがわかりました。0
を使用すると、awkはtrueと解釈した各行のすべての内容を印刷awk 1 inputfile
します。1
を使用すると、awk any_string inputfile
すべてのawk変数が0に初期化されるため、何も印刷されないため、falseです。
ところで を使用するとawk any_integer inputfile
true になり、ファイル内のすべての行を印刷しますが、なぜ何がわかりますか?
すでにこのアイテムが見つかりません。GNUawk
マニュアルしかし。
答え1
本物awkの場合は空ではありません。ひもまたは、ゼロ以外の数値(数値は10進数または浮動小数点数であり、一部のawk実装は16進数または8進数もサポートしています)です。二重引用符で囲まれた文字列は、引用符のない文字通りの数字は数字です。しかし、他の場合には、文字列と数値が何であるかを決定する複雑な規則があります。 GNUawk
マニュアルには全章。
本物:
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'
ええと:
awk '1e-500'
(誰かが文句を言い、誰かがゼロとして扱うでしょう)awk '"0x1" + 0'
(すべてのawk実装が16進数をサポートしているわけではありません。これを実行する実装では、他の実装ではThisが"0x1"
に変換され、16進環境はまだ認識されています)。1
0
gawk
POSIXLY_CORRECT
awk '010 - 8'
(8進数と同じです(ただし、010は文字列から変換されず、リテラルなので正確ではありません)。awk '0x1 - 1'
(awk
16進数をサポートしない実装では、およびを連結すると0x1
結果0
変数x1
が"0"
数値(0)に変換され、減算するとゼロ以外の数値に1
なります。)-1
つまり、文字列が空でないことを確認するには、次のことはできません。
awk '$1 {$1 印刷、「空ではない」}'
しかし、
awk '$1 != "" {print $1, "is not empty"}'
それ以外の場合はnullではないか、0
話しません-0000E+00001234
。