awk BEGINの$ 2(フィールドを参照)が機能しません。

awk BEGINの$ 2(フィールドを参照)が機能しません。

以下のコードスニペットでは、$2awkはnullを返します。私は何が間違っていましたか? MAXとMINの違いを調べたいと思います。

#!/bin/ksh
if [ $# -ne 1 ]; then
        echo "Usage: sh `basename ${0}` filename";
        exit 1;
fi
if [ ! -s ${1} ]; then
        echo "file doesn't exist or is empty";
        exit 1;
fi
sed -e '/^$/d' -e '/^#/d' ${1} |
awk  -F'=' '
        BEGIN {
                MIN=$2; MAX=$2; print MIN;
        }
        {
                if ( $2 > MAX )
                {
                        MAX = $2;
                }
                else if ( $2 < MIN )
                {
                        MIN = $2;
                }
        }
        END {
                DIFF=MAX-MIN; print "DIFF:" DIFF;
        }
'

しかし、これはうまくいきます。なぜ$2その部分では機能しないのですBEGINか?

#!/bin/ksh
if [ $# -ne 1 ]; then
        echo "Usage: sh `basename ${0}` filename";
        exit 1;
fi
if [ ! -s ${1} ]; then
        echo "file doesn't exist or is empty";
        exit 1;
fi
sed -e '/^$/d' -e '/^#/d' ${1} |
awk -F'=' '
        {
                if ( MAX == "" || MIN == "" )
                {
                        MAX = MIN = $2;
                }
                else
                {
                        if ( $2 > MAX )
                        {
                                MAX = $2;
                        }
                        else if ( $2 < MIN )
                        {
                                MIN = $2;
                        }
                }
        }
        END {
                DIFF=MAX-MIN; print "DIFF:" DIFF;
        }
'

ベストアンサー1

BEGINパターンが実行される今後NRすべての入力を読み取るため、入力を参照する変数(フィールドなど)はブロックに定義されていません。 2番目のアプローチは正確でより良いです。$0BEGINPOSIX awkの仕様強調する私のもの):

awkユーティリティは、BEGINとENDという2つの特殊パターンを認識する必要があります。各BEGINパターンは一度に一致し、関連する操作を実行する必要があります。入力の最初のレコードを読む前に...

1 ちなみに、最小値や最大値が特定の値(たとえば0)によって制限されているとは思わないので、これはインターネット上で見つけることができる多くの1行の仮定が仮定するものです。

おすすめ記事