免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: yestreenstars
打印 上一主题 下一主题

[文本处理] 去掉最大值和最小值然后求平均值 [复制链接]

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
21 [报告]
发表于 2013-03-27 15:11 |只看该作者
回复 19# yestreenstars


   

论坛徽章:
3
IT运维版块每日发帖之星
日期:2015-12-30 06:20:00IT运维版块每日发帖之星
日期:2016-02-16 06:20:00每日论坛发贴之星
日期:2016-02-16 06:20:00
22 [报告]
发表于 2013-03-27 15:23 |只看该作者
awk 看到了就感觉蛋疼菊紧 不相信爱情了

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
23 [报告]
发表于 2013-03-29 10:05 |只看该作者
本帖最后由 seesea2517 于 2013-03-29 10:07 编辑

@yjwan
@代号:军刀
@yestreenstars
@w630866139

我觉得要写成一行就不好理解,写成文件来,加点注释应该就好看一点了。

这是一个尝试:
  1. BEGIN {
  2.     OFS = FS
  3. }

  4. {
  5.     ar_person_info[$1] = $1 OFS $2 OFS $3       # 看样本,每个人的前三列都是一样的吧,就记录一份人物信息数据
  6.     ar_person_count[$1]++                       # 统计某人的出现次数

  7.     refresh_max($1, $4, $5)                     # 更新某人列四的最大值的信息
  8.     refresh_min($1, $4, $5)                     # 更新某人列四的最小值的信息

  9.     ar_sum[$1,4] += $4                          # 求和某人列四的值
  10.     ar_sum[$1,5] += $5                          # 求和某人列五的值
  11. }

  12. END {
  13.     for (name in ar_person_count)
  14.     {
  15.         print ar_person_info[name] OFS calc_agv(name, 4) OFS calc_agv(name, 5)
  16.     }
  17. }

  18. # 更新某人第四列的最大值的信息
  19. # 参数:人名,第四列新值,第五列新值
  20. function refresh_max(name, new_value_4, new_value_5)
  21. {
  22.     # 若第一次更新,则直接赋值,不需要比较
  23.     if (ar_person_count[name] == 1)
  24.     {
  25.         ar_max[name,4] = new_value_4
  26.         ar_max[name,5] = new_value_5
  27.         return
  28.     }

  29.     # 若新值不大于现有值,则不操作
  30.     if (new_value_4 <= ar_max[name,4])
  31.         return

  32.     # 更新最大值
  33.     ar_max[name,4] = new_value_4
  34.     ar_max[name,5] = new_value_5
  35. }

  36. # 更新某人第几列的最小值的信息
  37. # 参数:人名,第四列新值,第五列新值
  38. function refresh_min(name, new_value_4, new_value_5)
  39. {
  40.     # 若第一次更新,则直接赋值,不需要比较
  41.     if (ar_person_count[name] == 1)
  42.     {
  43.         ar_min[name,4] = new_value_4
  44.         ar_min[name,5] = new_value_5
  45.         return
  46.     }

  47.     # 若新值不小于现有值,则不操作
  48.     if (new_value_4 >= ar_min[name,4])
  49.         return

  50.     # 更新最小值
  51.     ar_min[name,4] = new_value_4
  52.     ar_min[name,5] = new_value_5
  53. }

  54. # 计算某个人第几列的平均值
  55. # 对超过 3 个的人做去最大最小值后再求平均值,不超过的直接求平均值
  56. # 参数:人名,列数
  57. function calc_agv(name, col)
  58. {
  59.     # 三次以下的直接求平均值
  60.     if (ar_person_count[name] < 3)
  61.     {
  62.         return ar_sum[name,col] / ar_person_count[name]
  63.     }

  64.     # 三次以上的扣除最大最小值再求平均值
  65.     return (ar_sum[name,col] - ar_max[name,col] - ar_min[name,col]) / (ar_person_count[name] - 2)
  66. }
复制代码
要说我觉得C/C++是比较好读的一种代码了,不过要是写成这样,那也是难懂啊(开个玩笑,这自然不是字面意义上的C/C++,当然要把好读的程序改成难懂的那不是相当容易嘛,而且还有现成的代码混淆器):
@cjaizss
++++++++++[>++++++++++[>+<-]<-]>>-.+++++++.---------.++++++++.>>++++[<++++[<+>-]>-]<<+.-------..

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
24 [报告]
发表于 2013-03-29 10:16 |只看该作者
回复 23# seesea2517


    辛苦您了~

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
25 [报告]
发表于 2013-03-29 10:22 |只看该作者
回复 24# yestreenstars


    这是寒掺我嘛……

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
26 [报告]
发表于 2013-03-29 10:26 |只看该作者
回复 25# seesea2517


    不是啦,我不是那个意思~写成多行脚本,再加上注释可以帮助新手更好地理解,这一点是极好的~

论坛徽章:
3
IT运维版块每日发帖之星
日期:2015-12-30 06:20:00IT运维版块每日发帖之星
日期:2016-02-16 06:20:00每日论坛发贴之星
日期:2016-02-16 06:20:00
27 [报告]
发表于 2013-03-29 10:28 |只看该作者
seesea2517 发表于 2013-03-29 10:05
@yjwan
@代号:军刀
@yestreenstars


爱你~么么思密达~~~

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
28 [报告]
发表于 2013-03-29 11:09 |只看该作者
回复 26# yestreenstars


@w630866139
嗯,对我这个新手很有帮助,我已经把 awk 当 C 来写了

论坛徽章:
3
IT运维版块每日发帖之星
日期:2015-12-30 06:20:00IT运维版块每日发帖之星
日期:2016-02-16 06:20:00每日论坛发贴之星
日期:2016-02-16 06:20:00
29 [报告]
发表于 2013-03-29 11:58 |只看该作者
seesea2517 发表于 2013-03-29 11:09
回复 26# yestreenstars

c早就忘光了 T_T
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP