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모든 입력을 읽으므로 입력을 참조하는 변수(예 : 필드 등) 가 블록에 정의되지 않습니다. 두 번째 접근 방식이 정확하고 더 좋습니다.$0BEGINPOSIX awk 사양(강조하다내 거):

awk 유틸리티는 BEGIN 및 END라는 두 가지 특수 패턴을 인식해야 합니다. 각 BEGIN 패턴은 한 번씩 일치하고 관련 작업을 수행해야 합니다.입력의 첫 번째 레코드를 읽기 전에...

1 그건 그렇고, 최소값이나 최대값이 특정 값(예: 0)에 의해 제한된다고 가정하지 않기 때문에 좋은데, 이는 인터넷에서 찾을 수 있는 많은 한 줄 가정이 가정하는 것입니다.

답변2

입력 텍스트의 첫 번째 줄에 명령을 실행하려면 가 NR==1아닌 패턴을 사용해야 합니다 BEGIN.

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

@jw013이 언급했듯이 BEGIN패턴은 첫 번째 줄을 읽기 전에 수행됩니다.

관련 정보