免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2436 | 回复: 12

[文本处理] 特定区域内的统计计算 [复制链接]

论坛徽章:
0
发表于 2017-09-06 15:39 |显示全部楼层
本帖最后由 gooderpan 于 2017-09-06 16:36 编辑

有一文件file1:(tab分隔)
#类型  位置    数目
1       92       123
1       156      91
1       197      23
1       279      221

另一文件file2:(tab分隔)
#类型   起始位置   结束位置
1         1             50
1         51           100
1         101         150
1         151         200
1         201         250
1         251         300

在file1中“类型”与file2“类型”相同情况下,查看file1的“位置”是否包含在file2的“起始位置”和“结束位置”之内,如果在,则统计相应区域内“数目”总和。(想要得到的结果如下)
1   1      50      0
1   51    100    123
1   101  150    0
1   151   200   114
1   201   250   0
1   251   300   221


论坛徽章:
0
发表于 2017-09-06 16:24 |显示全部楼层
题目没看懂

论坛徽章:
0
发表于 2017-09-06 16:35 |显示全部楼层
回复 2# y546188155

已修改,请查看!

论坛徽章:
30
申猴
日期:2014-04-10 09:43:532015年亚洲杯纪念徽章
日期:2015-03-20 14:40:232015亚冠之阿尔纳斯尔
日期:2015-06-02 18:59:042015亚冠之阿尔希拉尔
日期:2015-06-30 15:22:572015亚冠之大阪钢巴
日期:2015-07-20 10:44:332015亚冠之阿尔纳斯尔
日期:2015-10-28 14:57:5215-16赛季CBA联赛之新疆
日期:2015-12-25 10:18:45黑曼巴
日期:2016-06-26 21:39:5315-16赛季CBA联赛之山西
日期:2016-07-25 21:54:2715-16赛季CBA联赛之北京
日期:2016-10-27 12:07:2315-16赛季CBA联赛之八一
日期:2017-07-07 16:39:0915-16赛季CBA联赛之吉林
日期:2017-09-04 12:14:43
发表于 2017-09-06 17:08 |显示全部楼层
本帖最后由 zxy877298415 于 2017-09-07 09:20 编辑

回复 1# gooderpan


  1. awk 'FNR==NR{a[$2]=$3;b[$2]=$1" "NR;next}{for(i in a){split(b[i],c," ");if(int(i)>$2&&int(i)<$3&&c[1]==$1) {s+=a[i]}} print s?$0" "s:$0" 0";s=0}' file1 file2
复制代码

论坛徽章:
0
发表于 2017-09-06 17:36 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
发表于 2017-09-06 17:49 |显示全部楼层
回复 5# 本友会机友会摄友会

一般这类文件有1亿行,那就麻烦啦。

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
发表于 2017-09-06 18:06 |显示全部楼层

  1. awk 'NR==FNR{k=$1","$2","$3;a[k]=0;b[k]=$0;d[++c]=k;next}{for(i in a){split(i,e,",");if($1==e[1]&&$2>=e[2]&&$2<=e[3]){a[i]+=$3;break}}}END{while(j++<c)print b[d[j]],a[d[j]]}' file2 file1|column -t
复制代码

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2017-09-06 19:07 |显示全部楼层
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my %hData = ();
  5. while(<DATA>){
  6.         last if(/\A\s*\z/);
  7.         my ($id, @aT) = split;
  8.         push(@{$hData{$id}}, [@aT]);
  9. }

  10. while(<DATA>){
  11.         chomp;
  12.         my ($id, $b, $e) = split;
  13.         my ($v) = grep {$_->[0] >= $b and $_->[0] <= $e} @{$hData{$id}};
  14.         printf("$_\t%d\n", $v->[0] // 0);
  15. }

  16. __DATA__
  17. 1       92       123
  18. 1       156      91
  19. 1       197      23
  20. 1       279      221

  21. 1         1             50
  22. 1         51           100
  23. 1         101         150
  24. 1         151         200
  25. 1         201         250
  26. 1         251         300
复制代码

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
发表于 2017-09-06 19:34 |显示全部楼层
本帖最后由 wh7211 于 2017-09-06 19:55 编辑

回复 1# gooderpan

文件1:
#类型  位置    数目
1        92        123
1        156        91
1        197        23
1        279        221
2        40        1
2        60        2
2        110        3

文件2:
#类型   起始位置   结束位置
1        1        50
1        51        100
1        101        150
1        151        200
1        201        250
1        251        300
2        1        50
2        51        100
2        101        150

要求:输出如下内容:
1        1        50 0
1        51        100 123
1        101        150 0
1        151        200 114
1        201        250 0
1        251        300 221
2        1        50 1
2        51        100 2
2        101        150 3

注意:
1、按题主的要求,在file1中“类型”与file2“类型”相同情况下,查看file1的“位置”是否包含在file2的“起始位置”和“结束位置”之内,如果在,则统计相应区域内“数目”总和。
2、以下代码运行要求awk4.0。

  1. awk 'FILENAME==ARGV[1]{a[$1][$2]=$3;next}FNR>1{for(i in a){for(j in a[i]){s=$1==i&&int(j)>$2&&int(j)<$3?s+a[i][j]:+s}}print $0" "s;s=""}' 1 2
复制代码




论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2017-09-06 20:13 |显示全部楼层
回复 5# 本友会机友会摄友会
大师,有没有直接处理 Excel 的模块 (添加,修改,删除)
提供一个示例指导? (发个新帖,方便有问题向您老人家请教)



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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP