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行の仮定が仮定するものです。

答え2

入力テキストの最初の行にコマンドを実行するには、NR==1非パターンを使用する必要がありますBEGIN

awk  -F'=' '
    NR==1 {
            MIN=$2; MAX=$2; print MIN;
    }
    NR>1 {
            if ( $2 > MAX )
            {
                    MAX = $2;
            }
...

@jw013が述べたように、BEGINパターンは最初の行を読む前に行われます。

関連情報