0

次のようなサンプルファイルがあります

stat1:  sample:        0.0
stat2:  sample:        0.0
stat3:  sample:        349.7

stat1:  sample:        0.0
stat2:  sample:        0.0
stat3:  sample:        349.7

stat1:  sample:        0.0
stat2:  sample:        0.0
stat3:  sample:        349.7

私がしなければならないことは、各統計の最大値と平均値を見つけることです。

4

4 に答える 4

1
awk '{
         if (NF != 3) next
         sum[$1] += $3;
         if (cnt[$1]++ == 0) { max[$1] = $3; min[$1] = $3; }
         if ($3 > max[$1]) max[$1] = $3
         if ($3 < min[$1]) min[$1] = $3
     }
     END {
         printf "%-8s %4s %8s %8s %8s\n", "Sample", "N", "Minimum", "Maximum", "Average"
         for (key in sum)
         {
             printf "%-8s %4d %8.2f %8.2f %8.2f\n", key, cnt[key], min[key], max[key], sum[key]/cnt[key]
         }
     }' data-file

出力例(質問のデータからのもので、非常に刺激的ではありません):

Sample      N  Minimum  Maximum  Average
stat2:      3     0.00     0.00     0.00
stat1:      3     0.00     0.00     0.00
stat3:      3   349.70   349.70   349.70

このコードには、最小値と最大値が含まれています。不要な場合は簡単に削除できます。データ ファイルの空白行をスキップすることに注意してください。

于 2013-04-16T19:28:37.943 に答える
1

これは、awk 連想配列を使用すると非常に簡単です。

meanmax.awk

# Skip empty lines
NF==0 { next }

# Keep a tally of number of elements and their sum
{ cnt[$1]++; sum[$1] += $3 }

# If max[$1] has not been defined or if it is smaller than $3
cnt[$1] == 1 || max[$1] < $3 {
  max[$1] = $3
}

END {
  for (k in sum)
    print k, max[k], sum[k]/cnt[k]
}

次のように実行します。

awk -f meanmax.awk infile

出力:

stat1: 0.0 0                    
stat2: 0.0 0
stat3: 349.7 349.7

または、最初に投稿された入力で実行する場合:

stat1: 18.0 10.3333             
stat2: 45.0 16.6667
stat3: 239.7 89.4667
于 2013-04-16T19:30:19.650 に答える
1

Perl を使用してもかまわない場合:

perl -lane '{ if(/(stat\d+)/) {
    $m{$1} =$F[2] if $m{$1}<$F[2] || !$m{$_};
    $s{$1}+=$F[2]; $c{$1}++
}} END{print "$_: $m{$_},".$s{$_}/$c{$_} for keys %c}' input
于 2013-04-16T19:17:47.873 に答える
1

すべての値の平均と最大値が必要な場合は、次のようなものを試すことができます

awk '/sample:/ {s[$1] += $3; if(++n[$1]==1 || max[$1]<$3) max[$1] = $3}
END { for (i in s) print i" mean = "s[i]/n[i]", max = "max[i] }
' <<EOT
stat1:  sample:        0.0
stat2:  sample:        0.0
stat3:  sample:        349.7

stat1:  sample:        0.0
stat2:  sample:        0.0
stat3:  sample:        349.7

stat1:  sample:        0.0
stat2:  sample:        0.0
stat3:  sample:        349.7
EOT

出力:

stat3: mean = 349.7, max = 349.7
stat1: mean = 0, max = 0.0
stat2: mean = 0, max = 0.0
于 2013-04-16T19:34:16.900 に答える