%EA%B0%80%20%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
아래 코드 조각에서 $2
awk는 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
모든 입력을 읽으므로 입력을 참조하는 변수(예 : 필드 등) 가 블록에 정의되지 않습니다. 두 번째 접근 방식이 정확하고 더 좋습니다.$0
BEGIN
POSIX 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
패턴은 첫 번째 줄을 읽기 전에 수행됩니다.