以下のコードスニペットでは、$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
すべての入力を読み取るため、入力を参照する変数(フィールドなど)はブロックに定義されていません。 2番目のアプローチは正確でより良いです。$0
BEGIN
POSIX 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
パターンは最初の行を読む前に行われます。