web-dev-qa-db-ja.com

awkを使用した最大値と最小値

次のファイルから、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 }

ありがとう!

6
user2763235

このコードは、必要なものの概念を示すことができます。

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
}
6
konsolebox

forループを見てください

i = 0から始まるので、条件は次のようになります。

i<NF 

の代わりに

i<= NF

その行の代わりに次の行を試してください....私はあなたがあなたが探しているものを手に入れることを願っています

for(i=0;i<NF;i++){

残りはすべて私にはうまく見えます....ありがとう

1
nikhil

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

1
lulyon