1

次の質問があります。2つの最小値、最大値、およびこの入力の平均が必要です。

 Call 1 1.160 ms
 Call 2 0.163 ms
 Call 3 1.154 ms
 Call 4 1.029 ms
 Call 5 0.291 ms
 Call 6 1.186 ms
 Call 7 1.089 ms
 Call 8 1.122 ms
 Call 9 0.975 ms
 Call 10 1.224 ms
 Call 11 0.965 ms
 Call 12 1.047 ms
 Call 13 1.138 ms
 Call 14 1.217 ms
 Call 15 1.189 ms
 Call 16 1.115 ms
 Call 17 0.950 ms
 Call 18 1.112 ms
 Call 19 1.227 ms
 Call 20 1.071 ms
 Call 21 1.108 ms
 Call 22 1.191 ms
 Call 23 1.139 ms
 Call 24 1.032 ms
 Call 25 1.305 ms
 Call 26 1.085 ms
 Call 27 1.404 ms
 Call 28 1.282 ms
 Call 29 1.031 ms
 Call 30 1.018 ms
 Call 31 1.308 ms
 Call 32 1.299 ms
 Call 33 1.096 ms
 Call 34 1.129 ms
 Call 35 1.271 ms
 Call 36 1.035 ms
 Call 37 1.238 ms
 Call 38 1.150 ms
 Call 39 1.042 ms
 Call 40 0.948 ms

私はこれらのコマンドを使用しています:

 awk 'min=="" || $3 < min {min=$3; minline=$0}; END{ print minline}'

 awk '{ if ($3>max) {max=$3; line=$0} } END {print line }'

 awk '{s+=$3} END{print "Number of Calls: "NR, "\nAverage: "s/(NR)}'

出力は次のとおりです。

 Minimun: Call 18 0.212 ms
 Maximun: Call 27 1.404 ms
 Number of Calls: 40
 Average: 1.1071

ただし、2つの最小値が必要です。1つは上に示されていますが、もう1つは0.800より大きい任意の数値である必要があります。私はこれを試しました:

 awk 'min=="0.800" || $3 < min {min=$3; minline=$0}; END{ print minline}'

しかし、それは私に何も示していません。これをスクリプトに入れるためにあなたの助けが必要です。

よろしくお願いします

4

3 に答える 3

1

2つの最小値が必要です。

awk '{ if (min1==""||$3<=min1) { min2=min1; line2=line1; min1=$3; line1=$0; }
       else if (min2=="" || $3 <= min2)                { min2=$3; line2=$0; } }
       END{ print line1; print line2}'

出力:

Call 2 0.163 ms
Call 5 0.291 ms

最小値と0.8ミリ秒よりも大きい2番目の最小値が必要です。

awk '{ if (min1==""||$3<=min1) { if(min1>0.8) {min2=min1; line2=line1;} min1=$3; line1=$0; }
       else if ($3>0.8 && (min2=="" || $3 <= min2))                   { min2=$3; line2=$0; } }
       END{ print line1; print line2}'

出力:

 Call 2 0.163 ms
 Call 40 0.948 ms
于 2012-02-07T12:24:05.970 に答える
1
kent$  awk 'BEGIN{min=999}
{a[NR]=$0;if($3<min){min=$3;m[1]=NR;}if($3>max){max=$3;m[2]=NR;}m[3]+=$3;}
END{print "Min:"a[m[1]];
        print "Max:"a[m[2]];
        print "Number Of Calls:" NR;
        print "Avg:"m[3]/NR;
        t=max>0.800?a[m[2]]:"None";
        print "Any greater than 0.800:"t}' yourFile

出力:

Min:Call 2 0.163 ms
Max:Call 27 1.404 ms
Number Of Calls:40
Avg:1.08837
Any greater than 0.800:Call 27 1.404 ms

注:「0.800より大きい任意の数値」については、最大値を確認しました。0.800を超える場合は、魔法の数値として出力します。そうでない場合は、「なし」と出力します。

編集

OPのコメントの変更:

kent$  awk 'BEGIN{min=mag=999}
{a[NR]=$0;if($3<min){min=$3;m[1]=NR;}if($3>max){max=$3;m[2]=NR;}if($3>0.800&&$3<mag){mag=$3;m[4]=NR} m[3]+=$3;}
END{print "Min:"a[m[1]];
        print "Max:"a[m[2]];
        print "Number Of Calls:" NR;
        print "Avg:"m[3]/NR;
        print "Any greater than 0.800:"a[m[4]]}' yourFile

出力:

Min:Call 2 0.163 ms
Max:Call 27 1.404 ms
Number Of Calls:40
Avg:1.08837
Any greater than 0.800:Call 40 0.948 ms
于 2012-02-07T13:22:28.160 に答える
0

解決策1

これがPerlでの私の解決策であり、私は初心者ですが、学びたいと思っています。

#!/usr/bin/perl -n

BEGIN { $min1 = 9999; $min2 = 9999; $max = -1; }

($label, $callNumber, $callTime, $ms) = split;

$sum += $callTime;
if ($max < $callTime) {
    $max = $callTime;
    $maxLine = $_; 
}   

if ($min1 > $callTime) {
    $min1 = $callTime;
    $min1Line = $_; 
}   

if ($min2 > $callTime && $min1 != $callTime) {
    $min2 = $callTime;
    $min2Line = $_; 
}   

END {
    $average = $sum / $.; 
    print "Minimum1:        $min1Line";
    print "Minimum2:        $min2Line";
    print "Maximum:         $maxLine";
    print "Number of Calls: $.\n";
    print "Average:         $average\n";
}   

唯一注意が必要なのは、次に小さい値である$min2を計算することです。私のスクリプトは長いように見えますが、他のいくつかのソリューションよりも理解と保守が簡単だと思います。

解決策2

このソリューションは、2分、最大1つしか計算しませんが、比較的短いです。

sort -k 3,3 -n data.txt | sed -n '1,2s/^/Min: /p;$s/^/Max: /p'
于 2012-02-09T17:36:49.480 に答える