次のファイルから、MATHで始まる行のa、b、cの最大値と最小値をどのように見つけますか?
TITLE a b c
MATH 12.3 -0.42 5.5
ENGLISH 70.45 3.21 6.63
MATH 3.32 2.43 9.42
MATH 3.91 -1.56 7.22
ENGLISH 89.21 4.66 5.32
1つのコマンドラインだけにすることはできません。 BEGIN関数とENDを使用したスクリプトファイルである必要があります。
プログラムを実行すると、最小値が間違ってしまい、maxの文字列が表示されてしまいます。助けてください!
列aのコードは次のとおりです。
BEGIN { x=1 }
{
if ($1 == "MATH") {
min=max=$2;
for ( i=0; i<=NF; i++) {
min = (min < $i ? min : $i)
max = (max > $i ? max : $i)
}
}
}
END { print "max a value is ", max, " min a value is ", min }
ありがとう!
このコードは、必要なものの概念を示すことができます。
awk '$1!="MATH"{next}1;!i++{min=$2;max=$2;}{for(j=2;j<=NF;++j){min=(min<$j)?min:$j;max=(max>$j)?max:$j}}END{printf "Max value is %.2f. Min value is %.2f.\n", max, min}' file
出力:
MATH 12.3 -0.42 5.5
MATH 3.32 2.43 9.42
MATH 3.91 -1.56 7.22
Max value is 12.30. Min value is -1.56.
削除する 1
メッセージを抑制する:
awk '$1!="MATH"{next};...
スクリプトバージョン:
#!/usr/bin/awk
$1 != "MATH" {
# Move to next record if not about "MATH".
next
}
!i++ {
# Only does this on first match.
min = $2; max = $2
}
{
for (j = 2; j <= NF; ++j) {
min = (min < $j) ? min : $j
max = (max > $j) ? max : $j
}
}
END {
printf "Max value is %.2f. Min value is %.2f.\n", max, min
}
forループを見てください
i = 0から始まるので、条件は次のようになります。
i<NF
の代わりに
i<= NF
その行の代わりに次の行を試してください....私はあなたがあなたが探しているものを手に入れることを願っています
for(i=0;i<NF;i++){
残りはすべて私にはうまく見えます....ありがとう
Forループのi変数は、少なくとも行全体を表す0ではなく2(2番目のフィールド)で始まり、NFで終わる必要があります。
BEGIN { x=1;min=2147483647;max=-2147483648}
{
if ($1 == "MATH") {
for ( i=2; i<=NF; i++) {
min = (min < $i ? min : $i)
max = (max > $i ? max : $i)
}
}
}
END { print "max a value is ", max, " min a value is ", min }
コマンドで実行:(testawk.script
上記のawkスクリプトファイル名の場合、test.data
入力データファイル名の場合)
cat test.data | awk -f testawk.script
出力:
最大値は12.30分値は-1.56