awkは真と偽の条件を決定します

awkは真と偽の条件を決定します

を使用すると、条件が偽でawk 0 inputfileあるため、何も印刷されないことがわかりました。0

を使用すると、awkはtrueと解釈した各行のすべての内容を印刷awk 1 inputfileします。1

を使用すると、awk any_string inputfileすべてのawk変数が0に初期化されるため、何も印刷されないため、falseです。

ところで を使用するとawk any_integer inputfiletrue になり、ファイル内のすべての行を印刷しますが、なぜ何がわかりますか?

すでにこのアイテムが見つかりません。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進環境はまだ認識されています)。10gawkPOSIXLY_CORRECT
  • awk '010 - 8'(8進数と同じです(ただし、010は文字列から変換されず、リテラルなので正確ではありません)。
  • awk '0x1 - 1'awk16進数をサポートしない実装では、およびを連結すると0x1結果0変数x1"0"数値(0)に変換され、減算するとゼロ以外の数値に1なります。)-1

つまり、文字列が空でないことを確認するには、次のことはできません。

awk '$1 {$1 印刷、「空ではない」}'

しかし、

awk '$1 != "" {print $1, "is not empty"}'

それ以外の場合はnullではないか、0話しません-0000E+00001234

関連情報