awkのTrueは、空ではない文字列またはゼロ以外の数値のいずれかです(数値は10進整数または浮動小数点であり、一部のawk実装では16進数または8進数もサポートされます)。二重引用符で囲まれたものは文字列であり、引用符で囲まれていないリテラル数は数字ですが、それ以外のものについては、何かを文字列として扱うか数値として扱うかを決定する複雑なルールがあります。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実装が16進数をサポートしているわけではなく、16進数をに"0x1"変換し1たり、他のをに変換したりします0。POSIX仕様の一部のバージョンでは、その16進数をサポートするために誤ってその実装を必要とし、後で取り消されました。それでもgawk、16進数POSIXLY_CORRECTが環境)
awk '010 - 8' (8進数の場合も同じ(010は文字列から変換されたものとは対照的に、ここでは文字通りなので)
awk '0x1 - 1'(上のawk16進数をサポートしない実装、0x1の連結である0とx1利回り変数"0"の数(0)に変換され、あなたが引く場合は1、あなたが得る-1ゼロ以外の数値です)。
つまり、文字列が空でないかどうかを確認する場合は、次のことを行うべきではありません。
awk '$ 1 {print $ 1、 "is not empty"}'
だが
awk '$1 != "" {print $1, "is not empty"}'
そうでなければ、それは言っていない0か-0000E+00001234、空ではありません。
any_integer私はあなたのようなリテラルの数を意味すると仮定7, 89ので、理由以外の任意の数である場合など。を0手段のtrue条件