在以下代码段中,$2
awk 返回空。我究竟做错了什么?我试图找到 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)
BEGIN
在读取任何输入之前执行模式,因此不会在任何块中定义任何引用输入的变量,例如NR
,字段等。你的第二种方法是正确的,而且要好得多。¹来自POSIX awk 规范(强调我的):$0
BEGIN
awk 实用程序应识别两种特殊模式,BEGIN 和 END。每个 BEGIN 模式应匹配一次,并在读取第一条输入记录之前执行其关联的操作...
¹ 只是一个旁注,它也很好,因为它不会假设最小值或最大值受特定值(如 0)的限制,这是人们在互联网上发现的许多单行代码所假设的。