awkの「inf」は「-inf」のようには機能しません。

awkの「inf」は「-inf」のようには機能しません。

単一の列番号ファイルが与えられると、呼び出されると、f次のAwkコードは最大値を返します。

cat f | awk    '   BEGIN {max = -inf}
                       {if ($1>max) max=$1} 
                   END { print max }
               '

最小値を求めるのと同じ方法で結果は出ません。

cat f | awk '
               BEGIN  {min = inf}
                  {if ($1<min) min=$1} 
               END {print min}
            '

ただし、 をinf使用せずに で始まるmin = [some large number]場合、数字が十分に大きい場合(ファイルの内容に応じて)、修正されたコードが機能します。

なぜそれがうまくいかず、ファイルに何があるのか​​を知らずにケースをケースのように処理するinf方法はありますか?minmax

ベストアンサー1

これ実際仕事最善の解決策は、仮想の「最小」または「最大」数(この場合は使用中のフレームワークでは達成できない可能性がありますawk)ではなく、次のように最大/最小値を初期化することです。実際データ。これにより、常に意味のある結果が保証されます。

あなたの場合、ルールを追加して最初に見つかった値(つまり、最初の行のエントリ)を初期化してmaxそれぞれ使用できます。min

NR==1{min=$1}

あなたのスクリプトにawk。その後、最初の値がすでに最小値である場合、後続のテストはそれを処理せずに最終的に正しい結果を生成します。最大値検索にも同様に適用されるため、結合検索では次のことを宣言できます。

NR==1{max=min=$1}

infあなたの方法がうまくいかないのはなぜですか?そして@steeldriverがあなたの質問に対するコメントに良い説明を提供したawkようです-inf。完全性のためにまとめます。

  • では、awk変数は「動的に型付け」されます。つまり、使用方法に応じて、すべてが文字列または数字になる可能性があります(ただし、awk最後に使用された内容を「記憶」し、次の作業のためにその情報を保持します)。
  • コードで変数に関連する算術演算が見つかるたびに、そのawk変数の内容を数値として解釈して操作を実行しようとします。成功すると、そこから変数が数値として入力されます。
  • 何も割り当てられていない変数のデフォルト値は空の文字列であり、算術演算ではゼロと解釈されます。
  • これ変数名(*) inf特別な意味がないので、このようにawk使用するとのような算術式でゼロと評価される空変数である-inf。したがって、データがすべて正の場合、max変数がゼロに初期化された「最大検索」が機能します(したがって、負ではなく最小の数値)。-inf-inf
  • ただし、「最小検索」の問題では、この空の文字列を数値に自動的に変換することを保証する算術演算がないため、初期化は変数を空の文字列に初期min化します。inf
  • だから次の比較では

    if ($1<min) min=$1
    

    入力は$1文字列値と比較されるため、文字列awkとして処理され実行されます。$1事前編纂数字よりは比較してみてください。

  • しかし、事前編纂の観点からは、何もない空の文字列より「小さい」。min いいえ新しい値が割り当てられます。したがって、このEND部分では次のように述べる。

    print min
    

    (まだ)空の文字列を印刷します。

(*) バラよりSteven Kitの答えどのように内容を含む文字列"inf"実際に理解することができますawk

おすすめ記事