免费注册 查看新帖 |

Chinaunix

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

[文本处理] 关于规则统计 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-12-01 09:14 |只看该作者 |倒序浏览
本帖最后由 411024571 于 2014-12-01 09:24 编辑

我有一个数据文件,格式如下,第一列代表规则名称,第二列代表规则数量,以|分隔
1.|6
1.7.|3
2.|1
2.7.4|2
4.|1
7.|3
这是我程序的一个中间数据,
分别代表,
触发规则1,6次
同时触发1.  7  ,3次
....可能同时触发多个规则,触发规则数量不定
我要实现的需求是,将同时触发的规则,分别统计到单一规则中
例如第二条同时触发规则1和规则7,将规则1,加入到规则1,则规则1变为7次,同时触发多规则的数量不变(同时显示)
结果如下:
1.|9
1.7.|3
2.|3
2.7.4|2
4.|2
7.|8
求各位大神帮帮我,我已经琢磨2天了,谢谢!~

论坛徽章:
0
2 [报告]
发表于 2014-12-01 09:19 |只看该作者
说实话没看懂
1.|6
1.7|3

这里为什么数据结果不是
1|9

第一行6次第二行3次,6+3 =9 , 你在骗我么


回复 1# 411024571


   

论坛徽章:
0
3 [报告]
发表于 2014-12-01 09:21 |只看该作者
回复 2# KoomIer
汗颜!!!,我算错了,就是1.|9


   

论坛徽章:
6
处女座
日期:2014-04-02 16:07:17酉鸡
日期:2014-04-14 10:09:22子鼠
日期:2014-04-17 11:57:30辰龙
日期:2014-09-01 17:14:08戌狗
日期:2014-10-28 12:25:54未羊
日期:2014-11-14 11:31:58
4 [报告]
发表于 2014-12-01 10:05 |只看该作者
  1. awk -F"|" '{a[$1]=$2}END{for(i in a){if(!(i~/^[0-9]\.$/)){split(i,b,".");for(j in b){a[b[j]"."]+=a[i]}}};for(i in a){if(i~/[0-9]/)print i"|"a[i]}}' o | sort -n
复制代码

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
5 [报告]
发表于 2014-12-01 10:30 |只看该作者
试试这个
awk -F '|' 'NR==1{split($1,a,".");b=$2;next}{split($1,c,".");if(c[1] == a[1]){b+=$2;next;} printf "%d.|%d\n",a[1],b;a[1]=c[1];b=$2;} END{printf "%d.|%d\n",a[1],b}' 111

论坛徽章:
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
6 [报告]
发表于 2014-12-01 10:35 |只看该作者
1.|6
1.7.|3
2.|1
2.7.4|2
4.|1
7.|3

怎么有些管道符前有“点”,有些又没有呢?!

论坛徽章:
36
摩羯座
日期:2013-09-23 16:37:312015年亚洲杯之沙特阿拉伯
日期:2015-04-14 09:10:172015亚冠之柏太阳神
日期:2015-06-25 08:48:212015亚冠之武里南联
日期:2015-07-28 09:01:082015亚冠之莱赫维亚
日期:2015-07-28 15:44:172015亚冠之柏斯波利斯
日期:2015-09-06 14:08:52白银圣斗士
日期:2015-11-25 17:06:2815-16赛季CBA联赛之吉林
日期:2015-12-09 16:59:072016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之辽宁
日期:2016-04-14 09:29:04luobin
日期:2016-06-17 17:46:3615-16赛季CBA联赛之天津
日期:2016-08-16 14:11:01
7 [报告]
发表于 2014-12-01 10:38 |只看该作者
  1. awk 'BEGIN{FS=OFS="|"}{for(n=0;n++<split($1,a,".");)b[a[n]]+=$NF;c[$1]=$NF}END{for(i in c)if(b[+i])print i,b[+i];else print i,c[i]}' a.txt
复制代码

论坛徽章:
0
8 [报告]
发表于 2014-12-01 10:47 |只看该作者
回复 6# 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
9 [报告]
发表于 2014-12-01 10:51 |只看该作者
回复 8# 411024571

都有“点”的话可以用这个:
  1. awk -F'[.|]' 'NR==FNR{for(i=0;i++<NF-2;)a[$i]+=$NF;next}NF==3{sub(/[^|]+$/,a[$1])}1' file file
复制代码

论坛徽章:
0
10 [报告]
发表于 2014-12-01 11:01 |只看该作者
回复 4# rulebook
这个可以,但是数目有点对不上,我也看不出哪有问题
我用如下数据测试的
865.|1
882.|3
882.1246.|1
882.883.1246.|1
结果为
865.|2
882.|8
882.1246.|1
882.883.1246.|1
883.|1
1246.|2
882是错误的!
应该为882.|5



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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP