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'
(上のawk
16進数をサポートしない実装、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
条件