2009十一月9
awk 最大值,最小值 字符串转数字
马上就要用awk来分析一些日志,所以今天继续恶补。书上的例子看了就懂,有些飘飘然。然而真正动手却发现不是那么回事。看来好记性不如烂笔头,有些东西记下来比较好。
举个最简单的例子吧,用awk求一列的最大值和最小值。按照书中的要求来写出内容。其中最让人恶心的大概就是这个字符串转数字了。
Mike Harrington:(510) 548-1278:250:100:175
Christian Dobbins:(408) 538-2358:155:90:201
Susan Dalsass:(206) 654-6279:250:60:50
Archie McNichol:(206) 548-1348:250:100:175
Jody Savage:(206) 548-1278:15:188:150
Guy Quigley:(916) 343-6410:250:100:175
Dan Savage:(406) 298-7744:450:300:275
Nancy McNeil:(206) 548-1278:250:80:75
John Goldenrod:(916) 348-4278:250:100:175
Chet Main:(510) 548-5258:50:95:135
Tom Savage:(408) 926-3456:250:168:200
Elizabeth Stachelin:(916) 440-1763:175:75:300
Christian Dobbins:(408) 538-2358:155:90:201
Susan Dalsass:(206) 654-6279:250:60:50
Archie McNichol:(206) 548-1348:250:100:175
Jody Savage:(206) 548-1278:15:188:150
Guy Quigley:(916) 343-6410:250:100:175
Dan Savage:(406) 298-7744:450:300:275
Nancy McNeil:(206) 548-1278:250:80:75
John Goldenrod:(916) 348-4278:250:100:175
Chet Main:(510) 548-5258:50:95:135
Tom Savage:(408) 926-3456:250:168:200
Elizabeth Stachelin:(916) 440-1763:175:75:300
将该数据按格式输出,写如下awk命令文件
BEGIN{
FS="[:]";
print " ***CAMPAIGN 1998 CONTRIBUTIONS*** \n";
print "---------------------------------------------------------------------------\n";
printf "%-20s\t%22s\t%8s\t%8s\t%8s\t%8s\t\n","NAME","PHONE","Jan |"," Feb|","Mar |","TotalDonated";
print "---------------------------------------------------------------------------\n";
}
{
if( NR == 1) {
min = $3+0;
max = $5+0;
} else {
if( ($3+0) < min ) { min = $3+0 }
if( ($5+0) > max ) { max = $5+0 }
}
$6 = $3+$4+$5;
total += $6;
printf "%-25s\t%22s\t%8s\t%6.2f\t%6.2f\t%6.2f\t\n",$1,$2,$3,$4,$5,$6;
}
END{
avg = total/NR;
print "--------------------------------------------\n";
print " SUMMARY \n";
printf "The campaign received a total of $%6.2 for this quarter.\n",total;
printf "The everage donation for the "NR" contribuors was $%6.2f\n",avg;
printf "The highest contribution was $%6.2f\n",max;
printf "The lowest contribution was $%6.2f\n",min;
}
FS="[:]";
print " ***CAMPAIGN 1998 CONTRIBUTIONS*** \n";
print "---------------------------------------------------------------------------\n";
printf "%-20s\t%22s\t%8s\t%8s\t%8s\t%8s\t\n","NAME","PHONE","Jan |"," Feb|","Mar |","TotalDonated";
print "---------------------------------------------------------------------------\n";
}
{
if( NR == 1) {
min = $3+0;
max = $5+0;
} else {
if( ($3+0) < min ) { min = $3+0 }
if( ($5+0) > max ) { max = $5+0 }
}
$6 = $3+$4+$5;
total += $6;
printf "%-25s\t%22s\t%8s\t%6.2f\t%6.2f\t%6.2f\t\n",$1,$2,$3,$4,$5,$6;
}
END{
avg = total/NR;
print "--------------------------------------------\n";
print " SUMMARY \n";
printf "The campaign received a total of $%6.2 for this quarter.\n",total;
printf "The everage donation for the "NR" contribuors was $%6.2f\n",avg;
printf "The highest contribution was $%6.2f\n",max;
printf "The lowest contribution was $%6.2f\n",min;
}
如果min = $3+0; max = $5+0;这里不写上这个+0的话,得出的最大值最小值是按字符串方式比较的。(这个我现在也不敢肯定了,不过至少在我的服务器环境下面是这样的,我怀疑和我拷贝过去的原数据文件格式有关,可能在最后一列后面多出空格之类的东西)
现结果如下:

awk_min_max
文章作者:simaopig
本文地址:http://www.xiaoxiaozi.com/2009/11/09/1621/
版权所有 © 转载时必须以链接形式注明作者和原始出处!
呃,技术贴,来打酱油坐个沙发~~
[回复]
有点深奥 ~
[回复]
awk~~都没听过~囧~
[回复]
看不懂啊!不知道老兄什么时候叫我一下啊!
[回复]
还就没来了,占个前排~
[回复]
shell编程,处理数据库用?
[回复]
@young001
分析日志。从日志里面获取想要的数据,不影响线上服务响应速度。嗯。
[回复]
@simaopig 回复真效率,呵呵
[回复]
@young001
呃。刚才没时间回。呵呵。。
[回复]