単一の列番号ファイルが与えられると、呼び出されると、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
方法はありますか?min
max
ベストアンサー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
。