免费注册 查看新帖 |

Chinaunix

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

[文本处理] awk或perl怎么提取在某一动态范围内的文本信息? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-01-16 14:27 |只看该作者 |倒序浏览
如题,

假如文件A是这样:                       文件B:
chr1   223     367                       chr1   234     257     aa
chr1   455     772                       chr1   450     458     bb
chr1   8889   10022                   chr2   12       23       cc
chr2   11       666                      chr3   2301   2323    dd
chr2   769     1231                     ............
chr3   1765   2319
..........

现在想将B文件中两个数字的范围都包含在A文件中的那行提取出来,并且第一列标识符要对应,chr1在A文件里chr1的数字范围内找,chr2找chr2的,

上面举例中只有chr1   234     257     aa  可以被提取出来
                    chr2   12       23      cc

跨越了范围就不算,像B文件中第二行 450     458,就不算在A文件455     772的范围内

求大神支招!

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
2 [报告]
发表于 2015-01-16 15:40 |只看该作者
  1.         awk 'NR==FNR{
  2.                         arr1[$1]++;
  3.                         arr2[$1","arr1[$1]",min"]=$2;
  4.                         arr2[$1","arr1[$1]",max"]=$3;
  5.                         next;
  6.         }
  7.         ($1 in arr1){

  8.                 for(i=1; i<=arr1[$1]; i++) {
  9.                         if(($2 >= arr2[$1","i",min"] && $2 <= arr2[$1","i",max"]) && \
  10.                                         ($3 >= arr2[$1","i",min"] && $3 <= arr2[$1","i",max"]) \
  11.                                 )
  12.                                 print;
  13.                 }
  14.         }
  15.         END{
  16.                        
  17.         }' A.txt B.txt
复制代码
huangdongcong 该用户已被删除
3 [报告]
发表于 2015-01-16 15:46 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2015-01-16 21:44 |只看该作者
谢谢!!回复 2# liion631818


   

论坛徽章:
14
15-16赛季CBA联赛之辽宁
日期:2019-06-16 15:47:3515-16赛季CBA联赛之广夏
日期:2016-08-13 21:24:352015亚冠之武里南联
日期:2015-07-07 17:37:372015亚冠之萨济拖拉机
日期:2015-07-06 17:07:482015亚冠之全北现代
日期:2015-06-04 13:54:272015亚冠之城南
日期:2015-05-21 15:43:212015年亚洲杯之伊朗
日期:2015-04-25 18:20:362015年亚洲杯之伊朗
日期:2015-04-20 16:06:052015年亚洲杯之科威特
日期:2015-03-07 12:51:26丑牛
日期:2014-12-30 10:26:38申猴
日期:2014-09-28 22:40:18金牛座
日期:2014-09-13 21:12:22
5 [报告]
发表于 2015-01-16 22:28 |只看该作者
  1. py练习

  2. #!/usr/bin/env  python


  3. d1={}
  4. with open('11') as f:
  5.         for lines in f:
  6.                 l=lines.strip().split()
  7.                 d1.setdefault(l[0],[]).append(l[1:])


  8. with open('12') as f:
  9.         for lines in f:
  10.                 l=lines.strip().split()
  11.                 for k,v in d1.items():
  12.                         for n in v:
  13.                                 if (k==l[0]) and (l[1]>n[0]) and (l[2]<n[1]):
  14.                                         print lines,

  15. 结果:
  16. chr1 234 257 aa
  17. chr2 12 23 cc
复制代码

论坛徽章:
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
6 [报告]
发表于 2015-01-16 23:10 |只看该作者
  1. awk 'FNR==NR{a[$1]=a[$1]?a[$1]"#"$0:$0;b[$1]++;next}{split(a[$1],c,"#");for(i=1;i<=b[$1];i++){split(c[i],d," ");
  2. > if(($1==d[1])&&($2<d[2])&&($3>d[3])) {print d[1]"\t"d[2]"\t"d[3]"\t"d[4]}}}' file2 file1
  3. chr1    234     257     aa
  4. chr2    12      23      cc
复制代码
回复 1# xunong


   

论坛徽章:
9
2015亚冠之大阪钢巴
日期:2015-06-04 11:47:30丑牛
日期:2015-01-22 15:49:26巳蛇
日期:2015-01-22 10:11:18巨蟹座
日期:2014-11-20 10:55:03天蝎座
日期:2014-11-16 22:10:26处女座
日期:2014-11-16 11:01:10申猴
日期:2014-09-19 11:12:37双鱼座
日期:2014-07-25 10:09:54程序设计版块每日发帖之星
日期:2015-08-24 06:20:00
7 [报告]
发表于 2015-01-19 16:39 |只看该作者
回复 1# xunong
  1. awk 'NR==FNR{a[NR]=$1;b[NR]=$2;c[NR]=$0;d[NR]=$3;next}{for(i in a)if(a[i]==$1&&b[i]>$2&&d[i]<$3) print c[i]}' file2 file1
复制代码

论坛徽章:
9
2015亚冠之大阪钢巴
日期:2015-06-04 11:47:30丑牛
日期:2015-01-22 15:49:26巳蛇
日期:2015-01-22 10:11:18巨蟹座
日期:2014-11-20 10:55:03天蝎座
日期:2014-11-16 22:10:26处女座
日期:2014-11-16 11:01:10申猴
日期:2014-09-19 11:12:37双鱼座
日期:2014-07-25 10:09:54程序设计版块每日发帖之星
日期:2015-08-24 06:20:00
8 [报告]
发表于 2015-01-19 16:39 |只看该作者
哈哈哈哈哈, 我写的好蠢

论坛徽章:
0
9 [报告]
发表于 2015-01-23 11:38 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
20
卯兔
日期:2015-01-26 22:05:142015亚冠之萨济拖拉机
日期:2015-09-10 15:15:282015亚冠之阿尔希拉尔
日期:2015-09-25 17:37:53程序设计版块每日发帖之星
日期:2015-10-03 06:20:00程序设计版块每日发帖之星
日期:2015-12-09 06:20:00CU十四周年纪念徽章
日期:2015-12-17 09:07:15程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:342015亚冠之广州富力
日期:2015-08-27 19:29:56每日论坛发贴之星
日期:2015-08-26 06:20:002015亚冠之阿尔希拉尔
日期:2015-05-18 17:26:27
10 [报告]
发表于 2015-01-26 13:02 |只看该作者
  1. awk 'FNR==NR{a[$0]=$0}FNR!=NR{for(s in a){split(s,b," ");if($1==b[1]&&$2>=b[2]&&$3<=b[3]){print;next}}}' A B
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP