Минимум, Среднее и Максимум в столбцах

У меня есть следующий вопрос, я хотел бы иметь ДВА минимальных значения, максимальное значение и среднее значение для этого ввода:

 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 минимальных значения, одно из них показано выше, а другое должно быть любым числом больше 0,800. Я пробовал это:

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

Но мне ничего не показывает. Пожалуйста, мне нужна ваша помощь, чтобы разместить это в сценарии.

Заранее спасибо за вашу помощь


person Martin_911    schedule 07.02.2012    source источник
comment
другой должен быть любым числом больше 0,800. Пожалуйста, объясните это. почему это будет мин?   -  person Kent    schedule 07.02.2012
comment
Это трудно объяснить, это требование для меня тоже ..   -  person Martin_911    schedule 07.02.2012
comment
если это любое число, максимальное число также равно одному числу > 0,800, вы можете просто взять его.   -  person Kent    schedule 07.02.2012


Ответы (3)


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, напечатайте его как магическое число. если нет, выведите None.

ИЗМЕНИТЬ

изменения для комментария 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
person Kent    schedule 07.02.2012
comment
Это действительно здорово, извините за неконкретность, но не могли бы вы исправить свой скрипт, чтобы получить минимальное значение больше 0,800, пожалуйста? - person Martin_911; 07.02.2012
comment
@Martin_911 см. Редактировать в ответе - person Kent; 07.02.2012
comment
Большое спасибо, я очень ценю вашу помощь! - person Martin_911; 07.02.2012

Вам нужны два минимальных значения:

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 мс:

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
person oHo    schedule 07.02.2012
comment
Прошу прощения за свое невежество, но где вы заявили, что первый раз должен быть минимумом, а второй должен быть больше 0,800? - person Martin_911; 07.02.2012
comment
На самом деле вывод должен быть таким: Минимум: Call 18 0,212 мс Минимум Call больше 0,800: Call 17 0,950 мс Максимум: Call 27 1,404 мс Количество вызовов: 40 Среднее: 1,1071 - person Martin_911; 07.02.2012
comment
Огромное спасибо. Не могли бы вы позволить мне отредактировать ввод и попробовать еще раз, пожалуйста, с вашим скриптом, пожалуйста? - person Martin_911; 07.02.2012
comment
Я уже сделал это, вы сможете увидеть, что вызов 2 составляет 0,163, а вызов 5 - 0,291 мс. Когда я запускаю ваш скрипт (с новым вводом), он показывает мне вызов 2 0,163 и вызов 5 0,291. - person Martin_911; 07.02.2012
comment
Хорошо, я вижу проблему. Как же я этого не видел. Я проверил дело... Хорошо, я исправляю это ;-) - person oHo; 07.02.2012
comment
Да, верно ;-) Я думал, что Call 2 больше, чем Call 1 - person oHo; 07.02.2012
comment
Хорошо, я понимаю: вам нужно минимальное значение, а второе минимальное значение больше 0,8 мс. не так ли? - person oHo; 07.02.2012
comment
Большое спасибо, я очень ценю вашу помощь! - person Martin_911; 07.02.2012

Решение 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

Это решение вычисляет только два минимума, один максимум, но оно относительно короткое:

sort -k 3,3 -n data.txt | sed -n '1,2s/^/Min: /p;$s/^/Max: /p'
person Hai Vu    schedule 09.02.2012