trueおよびfalseのawk条件


9

を使用した場合awk 0 inputfile、何も出力されない原因に遭遇しました0。これは、条件が偽であることを意味します。

を使用するとawk 1 inputfile1awkが解釈する各行について、すべてを平均として印刷します。

を使用するとawk any_string inputfile、すべてのawk変数がゼロとして初期化されるためfalseになるため、何も出力されません。

しかし、を使用awk any_integer inputfileすると、trueになり、ファイルの各行を出力します。理由は何でしょうか?

これについては、GNU awkマニュアルで説明されていますが見つかりません。


3
any_integer私はあなたのようなリテラルの数を意味すると仮定7, 89ので、理由以外の任意の数である場合など。を0手段のtrue条件
Sundeep

回答:


13

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の連結である0x1利回り変数"0"の数(0)に変換され、あなたが引く場合は1、あなたが得る-1ゼロ以外の数値です)。

つまり、文字列が空でないかどうかを確認する場合は、次のことを行うべきではありません。

awk '$ 1 {print $ 1、 "is not empty"}'

だが

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

そうでなければ、それは言っていない0-0000E+00001234、空ではありません。


印象的で詳細な答え!しかし、1つの質問:あなたが与えた最後の例で、私は構文を試してみましたが、最初の例は機能しますが、空の$ 1をスキップし、空でない$ 1の行のみを印刷します。$ 1が空の文字列の場合、 False、したがって出力を印刷しないのではないですか?
sylye 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.