免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3884 | 回复: 10
打印 上一主题 下一主题

UNIX shell 范例精解(第四版)中一个awk的自定义函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-03 12:54 |只看该作者 |倒序浏览
Mike Harrington510) 548-1278:250:100:175
Chrstian Dobbins40 538-2358:155:90:201
Susan Dalsass206) 548-1348:250:60:50
Archie McNichol206) 654-6279: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:(40 926-3456:250:168:200
Elizabeth Stachelin:(916) 440-1763:175:75:300

数据库如上,编写一个用户自定义函数,要求该函数能返回指定月份的人均捐款额,月份由用户在命令行输入
各位大哥大姐,希望能帮个忙,我都想了1天了
不好意思,刚才没有写清楚, 姓名   ----电话-----捐款额(最后三个)


[ 本帖最后由 wsxedcer 于 2009-4-3 13:38 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-04-03 13:02 |只看该作者
你这数据哪个字段是时间?哪个是捐款额啊
zhuangxiaosong 该用户已被删除
3 [报告]
发表于 2009-04-03 13:06 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2009-04-03 13:11 |只看该作者
自己顶自己,不好意思了刚才
格式为  以冒号分割
姓名       电话号码     三个捐款额

论坛徽章:
0
5 [报告]
发表于 2009-04-03 13:12 |只看该作者
这个。。应该是写个shell函数吧
假设datafile第一字段为日期(20090101),最后一个字段为金额
  1. #!/bin/bash
  2. avg_mon ()
  3. {
  4.    awk -F ":" -v mon="$1" 'substr($1,1,6)==mon{c++;s+=$NF}END{print mon":"s/c}' datafile
  5. }
  6. while :
  7. do
  8.   printf "请输入月份:"
  9.   read mon
  10.   avg_mon $mon
  11. done
复制代码

[ 本帖最后由 ywlscpl 于 2009-4-3 13:18 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-04-03 13:18 |只看该作者
题目是在awk章节的末尾,如果是写shell函数,该怎么下手呢?

论坛徽章:
0
7 [报告]
发表于 2009-04-03 13:21 |只看该作者
因为我看书上讲的自定义函数是
function 函数名(参数,参数,...){
语句
return 表达式

所以我想用这种方式来完成,行吗?

论坛徽章:
0
8 [报告]
发表于 2009-04-03 13:58 |只看该作者
纯awk的,第一字段日期,最后一个字段金额

[root@Mylinux tmp]# cat datafile
20090202:Susan Dalsass206) 548-1348:250:60:50
20090202:Archie McNichol206) 654-6279:250:100:175
[root@Mylinux tmp]# cat myawk
#!/bin/awk -f
function avg_mon (mon)
{
  while (getline)
  if (substr($1,1,6)==mon)
  {
    c++
    s+=$NF
  }
  print mon":"s/c
}
BEGIN  {system("printf \"请输入月份:\";read mon;echo $mon>tmpfile"
        getline v <"tmpfile"
        avg_mon(v)
}
[root@Mylinux tmp]# awk -F ":" -f myawk datafile
请输入月份:200902
200902:112.5

论坛徽章:
0
9 [报告]
发表于 2009-04-03 14:45 |只看该作者
#!/bin/bash

function dosth()
{
  local month file
    month=$1
    file=$2

    awkline='BEGIN{FS=":"}{sum+=$'$(($month+2))'}END{print sum/NR}'
    echo `awk "$awkline" $file`
   
}
ARGC=2
if [ $# != $ARGC ];then
echo "useage:....";exit 1
fi

RE=`dosth $1 $2`
echo "result: $RE"
exit 0

bash ex1 3 test
result: 173.833

[ 本帖最后由 justlooks 于 2009-4-3 14:47 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2009-04-03 16:46 |只看该作者
  1. #!/bin/awk -f
  2. function avg_mon (arg)
  3. {
  4.   if (arg=="one") n=3
  5.   if (arg=="two") n=4
  6.   if (arg=="thr") n=5
  7.   if (arg=="q") exit
  8.   while (getline)
  9.   {
  10.     c++
  11.     s+=$n
  12.   }
  13.   print "月份"arg"平均: "s/c
  14. }
  15. BEGIN  {
  16.         while (!(input=="one"||input=="two"||input=="thr"||input=="q")){
  17.         printf "请输入月份: "
  18.         getline input <"/dev/tty"
  19.         }
  20.         avg_mon(input)
  21. }
复制代码


[root@Mylinux tmp]# awk  -F ":" -f myawk datafile

[ 本帖最后由 ywlscpl 于 2009-4-3 16:58 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP