Linux 列中的最小值、平均值和最大值
我有下一个问题,我想有两个最小值,一个最大值和这个输入的平均值:Linux 列中的最小值、平均值和最大值,linux,bash,awk,gawk,Linux,Bash,Awk,Gawk,我有下一个问题,我想有两个最小值,一个最大值和这个输入的平均值: 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
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)}'
但我需要有2个最小值,其中一个在上面显示,但另一个应该是大于0.800的任何数字。我试过这个:
awk 'min=="0.800" || $3 < min {min=$3; minline=$0}; END{ print minline}'
awk'min==“0.800”| |$3
但我什么也看不出来。求你了,我需要你的帮助把这个放到脚本里
提前感谢您的帮助您需要两个最小值:
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}'
您希望最小值和第二个最小值大于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}'
注意:对于“大于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
解决方案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";
}
我很抱歉我的无知,但是你在哪里声明第一次应该是最小值,另一次应该大于0.800?实际上输出应该是这样的:最小值:呼叫18 0.212毫秒最小值呼叫大于0.800:呼叫17 0.950毫秒最大值:呼叫27 1.404毫秒呼叫数:40平均值:1.1071非常感谢你。请允许我编辑输入并使用脚本重试好吗?我已经这样做了,您将能够看到呼叫2是0.163,呼叫5是0.291毫秒。当我运行您的脚本(使用新输入)时,它显示我呼叫2 0.163和呼叫5 0.291 OK,我看到了问题。我怎么没看到呢。我测试了这个案子。。。好的,我正在修理;-)“另一个应该是大于0.800的任何数字。”请解释一下。为什么会是最小值?这很难解释,对我来说也是一个要求。如果是“任何数字”,最大值也是一个大于0.800的数字,你可以只取一个。这真的很好,sry没有具体说明,但你能修改你的脚本以获得大于0.800的最小值吗?@Martin_911参见回答中的编辑谢谢你,我真的很感谢你的帮助!
Call 2 0.163 ms
Call 40 0.948 ms
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
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
#!/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";
}
sort -k 3,3 -n data.txt | sed -n '1,2s/^/Min: /p;$s/^/Max: /p'