LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1631|回复: 6

请教:awk 取最大值,,新的问题(已解决)

[复制链接]
发表于 2009-9-3 14:35:14 | 显示全部楼层 |阅读模式
ab5.data1
Mike Harrington510) 548-1278:250:100:175
Christian Dobbi408) 538-2358:155:90:201
Susan Dalsass206) 654-6279:250:60:50
Archie McNichol206) 548-1348:250:100:175
Jody Savage206) 548-1278:15:188:150
Guy Quigley916) 343-6410:250:100:175
Dan Savage406) 298-7744:450:300:275
Nancy McNeil206) 548-1278:250:80:75
John Goldenrod916) 348-4278:250:100:175
Chet Main510) 548-5258:50:95:135
Tom Savage:(408) 926-3456:250:168:200
Elizabeth Stach:(916) 440-1763:175:75:300


要求写脚本达到以下效果:


        ***CAMPAIGN 1998 CONTRIBUTIONS***
________________________________________________________________________

NAME                         PHONE                   Jan  | Feb  | Mar  | Total Donated
________________________________________________________________________
Mike Harrington        (510) 548-1278    250   100     175        525
Christian Dobbi         (408) 538-2358    155   90       201        446
Susan Dalsass          (206) 654-6279    250   60       50          360
Archie McNichol        (206) 548-1348    250   100    175        525
Jody Savage              (206) 548-1278    15      188    150        353
Guy Quigley               (916) 343-6410     250   100    175        525
Dan Savage               (406) 298-7744     450   300    275        1025
Nancy McNeil            (206) 548-1278     250   80       75          405
John Goldenrod        (916) 348-4278     250   100     175        525
Chet Main                   (510) 548-5258     50     95        135        280
Tom Savage               (408) 926-3456     250  168      200        618
Elizabeth Stach          (916) 440-1763     175  75        300        550
_________________________________________________________________________

            SUMMARY
_________________________________________________________________________
The campaign received a total of $6137.00 for this quarter.
The average donation for the 12 contributors was $511.42.
The highest contribution was $300.00
The lowest contribution was $15.00

除了最后三个要求:
The average donation for the 12 contributors was $511.42.  (请问这个四舍五入怎么解决?)
The highest contribution was $300.00
The lowest contribution was $15.00

其它的都解决了,请问这两个要求如何解决?

我的脚本:
cat awk.sc
BEGIN{FS=":"
        print "\n"
        print "\t\t ***CAMPAIGN 1998 CONTRIBUTIONS***"
        print "_________________________________________________________________"
        print "NAME\t\tPHONE\t\tJAN  |  FEB |  MAR | Total Donated"
        print "_________________________________________________________________"
}
{$6 = $3+$4+$5;print $1"\t"$2"\t"$3"\t"$4"\t"$5"\t"$6}
{total+=$6;average=total/12}
END{
        close("sort -n")
        close("tail -n 1")
        print "_________________________________________________________________"
        print "\t\tSUMARY"
        print "_________________________________________________________________"
        print "The campaign received a total of $"total".00 for this quarter."
        print "The average donation for the 12 contributors was $"average"."
        print "The highest contribution was"highest
        print "The lowest contribution was"lowest
}


我能用单条命令
awk -F:  '{print $5 | sort -n | tail -n 1}'
把最大值450弄出来。但是不知道怎么回到脚本里并把它赋值。

期待解答!!
发表于 2009-9-4 03:46:27 | 显示全部楼层
1四舍五入可以用:
printf("xxxx%.0fxxxx\n",average);
最大值:
awk -F: "BEGIN{max=0}{if($5>max)max=$5;}END{print max}"
awk算是比较完整的处理数据脚本语言,要用编程的思想来使用它。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-7 09:56:16 | 显示全部楼层
Post by lastart;2023727
1四舍五入可以用:
printf("xxxx%.0fxxxx\n",average);
最大值:
awk -F: "BEGIN{max=0}{if($5>max)max=$5;}END{print max}"
awk算是比较完整的处理数据脚本语言,要用编程的思想来使用它。


非常感谢你的回复..
你给的答案单条执行是可以的.但是我不知道怎么把这两句加到那个脚本里面去.特别是后面那具最大值的,一个脚本里可以同时出现两个或多个BEGIN(END)吗?
.我是脚本初学者...
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-7 12:31:13 | 显示全部楼层
有新进展了,还 有一个四舌五入没解决.

                 ***CAMPAIGN 1998 CONTRIBUTIONS***
_________________________________________________________________
NAME            PHONE           JAN  |  FEB |  MAR | Total Donated
_________________________________________________________________
Mike Harrington (510) 548-1278  250     100     175     525
Christian Dobbi (408) 538-2358  155     90      201     446
Susan Dalsass   (206) 654-6279  250     60      50      360
Archie McNichol (206) 548-1348  250     100     175     525
Jody Savage     (206) 548-1278  15      188     150     353
Guy Quigley     (916) 343-6410  250     100     175     525
Dan Savage      (406) 298-7744  450     300     275     1025
Nancy McNeil    (206) 548-1278  250     80      75      405
John Goldenrod  (916) 348-4278  250     100     175     525
Chet Main       (510) 548-5258  50      95      135     280
Tom Savage      (408) 926-3456  250     168     200     618
Elizabeth Stach (916) 440-1763  175     75      300     550
_________________________________________________________________
                SUMARY
_________________________________________________________________
The campaign received a total of $6137.00 for this quarter.
The average donation for the 12 contributors was $511.417.
The highest contribution was $300
The lowest contribution was $15

cat awk.sc
BEGIN{FS=":"
        print "\n"
        print "\t\t ***CAMPAIGN 1998 CONTRIBUTIONS***"
        print "_________________________________________________________________"
        print "NAME\t\tPHONE\t\tJAN  |  FEB |  MAR | Total Donated"
        print "_________________________________________________________________"
        highest = 0
        lowest = 10000
}
{$6 = $3+$4+$5;print $1"\t"$2"\t"$3"\t"$4"\t"$5"\t"$6}
{total+=$6;average=total/12}
{if($5 > highest) highest = $5;}
{if($3 < lowest) lowest = $3;}
END{
        print "_________________________________________________________________"
        print "\t\tSUMARY"
        print "_________________________________________________________________"
        print "The campaign received a total of $"total".00 for this quarter."
        print "The average donation for the 12 contributors was $"average"."
        print "The highest contribution was $"highest
        print "The lowest contribution was $"lowest
}
回复 支持 反对

使用道具 举报

发表于 2009-9-7 13:30:50 | 显示全部楼层
  1. {$6 = $3+$4+$5;print $1"\t"$2"\t"$3"\t"$4"\t"$5"\t"$6}
  2. {total+=$6;average=total/12}
  3. {if($5 > highest) highest = $5;}
  4. {if($3 < lowest) lowest = $3;}
复制代码
这些东西写在一个大括号里就可以了。
四舍五入我不是已经说了吗:
  1. printf( "The average donation for the 12 contributors was $%.0f.\n", average)
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-7 14:03:23 | 显示全部楼层
Post by lastart;2024741

  1. {$6 = $3+$4+$5;print $1"\t"$2"\t"$3"\t"$4"\t"$5"\t"$6}
  2. {total+=$6;average=total/12}
  3. {if($5 > highest) highest = $5;}
  4. {if($3 < lowest) lowest = $3;}
复制代码

这些东西写在一个大括号里就可以了。
四舍五入我不是已经说了吗:

  1. printf( "The average donation for the 12 contributors was $%.0f.\n", average)
复制代码



非常感谢,已经解决了..原来要用printf才能打印出来
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-7 14:04:04 | 显示全部楼层
cat awk.sc
[root@em ~]# cat awk.sc
BEGIN{FS=":"
print "\n"
print "\t\t ***CAMPAIGN 1998 CONTRIBUTIONS***"
print "_________________________________________________________________"
print "NAME\t\tPHONE\t\tJAN | FEB | MAR | Total Donated"
print "_________________________________________________________________"
highest = 0
lowest = 10000
}
{$6 = $3+$4+$5;print $1"\t"$2"\t"$3"\t"$4"\t"$5"\t"$6}
{total+=$6;average=total/12}
{if($5 > highest) highest = $5;}
{if($3 < lowest) lowest = $3;}
END{
print "_________________________________________________________________"
print "\t\tSUMARY"
print "_________________________________________________________________"
printf "The campaign received a total of $" "%2.2f\n",total" for this quarter."
printf "The average donation for the 12 contributors was $" "%2.2f\n",average"."
print "The highest contribution was $"highest
print "The lowest contribution was $"lowest
}


[root@em ~]# awk -f awk.sc lab5.data


***CAMPAIGN 1998 CONTRIBUTIONS***
_________________________________________________________________
NAME PHONE JAN | FEB | MAR | Total Donated
_________________________________________________________________
Mike Harrington (510) 548-1278 250 100 175 525
Christian Dobbi (408) 538-2358 155 90 201 446
Susan Dalsass (206) 654-6279 250 60 50 360
Archie McNichol (206) 548-1348 250 100 175 525
Jody Savage (206) 548-1278 15 188 150 353
Guy Quigley (916) 343-6410 250 100 175 525
Dan Savage (406) 298-7744 450 300 275 1025
Nancy McNeil (206) 548-1278 250 80 75 405
John Goldenrod (916) 348-4278 250 100 175 525
Chet Main (510) 548-5258 50 95 135 280
Tom Savage (408) 926-3456 250 168 200 618
Elizabeth Stach (916) 440-1763 175 75 300 550
_________________________________________________________________
SUMARY
_________________________________________________________________
The campaign received a total of $6137.00 for this quarter.
The average donation for the 12 contributors was $511.42
The highest contribution was $300
The lowest contribution was $15
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表