awk BEGIN 中的 $2(字段参考)不起作用

1 shell scripting ksh awk

在以下代码段中,$2awk 返回空。我究竟做错了什么?我试图找到 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;
        }
'
Run Code Online (Sandbox Code Playgroud)

但是,这工作正常。为什么$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;
        }
'
Run Code Online (Sandbox Code Playgroud)

jw0*_*013 6

BEGIN读取任何输入之前执行模式,因此不会在任何块中定义任何引用输入的变量,例如NR,字段等。你的第二种方法是正确的,而且要好得多。¹来自POSIX awk 规范强调我的):$0BEGIN

awk 实用程序应识别两种特殊模式,BEGIN 和 END。每个 BEGIN 模式应匹配一次,并在读取第一条输入记录之前执行其关联的操作...

¹ 只是一个旁注,它也很好,因为它不会假设最小值或最大值受特定值(如 0)的限制,这是人们在互联网上发现的许多单行代码所假设的。