免费注册 查看新帖 |

Chinaunix

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

[文本处理] 对重叠区间交集进行合并处理 [复制链接]

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-09-13 11:00 |只看该作者 |倒序浏览
这个问题纠结一晚了,一直得不到解决,各位大大有好的建议吗?

如果我想处理下面的文本,已知第二第三列为其起始终止坐标,当他们第五列相同时比较他们的第二第三列,如果坐标区间有重叠,则合并之并取其最小的起始坐标和最大的终止坐标,对处理后的数据进行排序,在第五列字符串后加上号码.

我的输入数据:
  1. refseq1 860921  861380  +       NM_152486       SAMD11
  2. refseq1 861102  861593  +       NM_152486       SAMD11
  3. refseq1 865335  865916  +       NM_152486       SAMD11
  4. refseq1 866219  866669  +       NM_152486       SAMD11
  5. refseq1 870952  871476  +       NM_152486       SAMD11
  6. refseq1 874220  874709  +       NM_152486       SAMD11
  7. refseq1 874455  875040  +       NM_152486       SAMD11
  8. refseq1 876324  876886  +       NM_152486       SAMD11
  9. refseq1 877316  877831  +       NM_152486       SAMD11
  10. refseq1 877590  878068  +       NM_152486       SAMD11
  11. refseq1 877739  878638  +       NM_152486       SAMD11
  12. refseq1 878433  878957  +       NM_152486       SAMD11
  13. refseq1 878878  879388  +       NM_152486       SAMD11
  14. refseq1 879088  880161  +       NM_152486       SAMD11
  15. refseq1 935046  935752  -       NM_021170       HES4
  16. refseq1 934872  935367  -       NM_021170       HES4
  17. refseq1 934706  935193  -       NM_021170       HES4
  18. refseq1 934142  935012  -       NM_021170       HES4
  19. refseq2 287813  288508  -       NM_001002919    FAM150B
  20. refseq2 287383  288092  -       NM_001002919    FAM150B
  21. refseq2 286090  286543  -       NM_001002919    FAM150B
  22. refseq2 285923  286403  -       NM_001002919    FAM150B
  23. refseq2 282911  283375  -       NM_001002919    FAM150B
  24. refseq2 279363  280352  -       NM_001002919    FAM150B
复制代码
理论上应该得到的数据:
  1. >NM_152486_E1   SAMD11  refseq1 +       860921  861593  
  2. >NM_152486_E2   SAMD11  refseq1 +       865335  865916  
  3. >NM_152486_E3   SAMD11  refseq1 +       866219  866669  
  4. >NM_152486_E4   SAMD11  refseq1 +       870952  871476  
  5. >NM_152486_E5   SAMD11  refseq1 +       874220  875040  
  6. >NM_152486_E6   SAMD11  refseq1 +       876324  876886  
  7. >NM_152486_E7   SAMD11  refseq1 +       877316  878068  
  8. >NM_152486_E8   SAMD11  refseq1 +       878878  880161  
  9. >NM_001002919_E1        FAM150B refseq2 -       279363  280352  
  10. >NM_001002919_E2        FAM150B refseq2 -       282911  283375  
  11. >NM_001002919_E3        FAM150B refseq2 -       285923  286543  
  12. >NM_001002919_E4        FAM150B refseq2 -       287383  288508  
  13. >NM_021170_E1   HES4    refseq1 -       934142  935193  934342  
复制代码

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
2 [报告]
发表于 2013-09-13 11:35 |只看该作者
你这个结果是不是不对?

就拿这行来说,

>NM_152486_E7   SAMD11  refseq1 +       877316  878068

-------------

refseq1 877316  877831  +       NM_152486       SAMD11
refseq1 877590  878068  +       NM_152486       SAMD11
refseq1 877739  878638  +       NM_152486       SAMD11
refseq1 878433  878957  +       NM_152486       SAMD11

877590  878068

877739  878638
不是有重叠部分么? 何以到878068就结束了?

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
3 [报告]
发表于 2013-09-13 12:34 |只看该作者
假如数据没规律这个awk很难实现的。

思路:

先针对$2,$3排序,而且$2/$3必须要升序或者降序。


NR==1的时候m=$2,n=$3,t=$5

NR>1

判断$5是否相同,假如是yes

分3种情况判断第一行的$2/$3是否重合:

1)

2 3
1  4

完全重合,则合并为1 4

2)

1 3
2 5
合并为1 5

3)

1 4
2 5

合并为 1 5


假如都不符合这3个,直接打印 $2,$3和你要的结果。
最终的结果可能顺序和你给的顺序不一致。因为经过了排序和awk加工处理。

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
4 [报告]
发表于 2013-09-13 12:34 |只看该作者
其实你给的数据都是干扰别人观看的,直接列出$2/$3/$5,然后把模型简化一下可能更易懂一些。

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
5
发表于 2013-09-13 13:30
回复 2# reyleon


    是的。。。不好意思

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
6 [报告]
发表于 2013-09-13 13:31 |只看该作者
回复 4# expert1


    对不起,给大大们添麻烦了

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
7 [报告]
发表于 2013-09-13 13:31 |只看该作者
回复 3# expert1


    我也是这么想的,可是实现起来好难{:3_201:}

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
8 [报告]
发表于 2013-09-13 13:45 |只看该作者
回复 1# huang6894

Would you like this ...

# awk '{k=sprintf("%s_%020d",$5,$2);for(n=0;n++<6;)a[k,n]=$n;c[k]}END{$5="";t=asorti(c,s);for(n=0;n++<t+1;){N=s[n];if($5==a[N,5]&&$3+1>=a[N,2])a[N,2]=$2;else if($5)print ">"$5"_E"++C,$6,$1,$4,$2,$3;if($5!=a[N,5])C=0;for(m=0;m++<6;)$m=a[N,m]}}' FILE
>NM_001002919_E1 FAM150B refseq2 - 279363 280352
>NM_001002919_E2 FAM150B refseq2 - 282911 283375
>NM_001002919_E3 FAM150B refseq2 - 285923 286543
>NM_001002919_E4 FAM150B refseq2 - 287383 288508
>NM_021170_E1 HES4 refseq1 - 934142 935752
>NM_152486_E1 SAMD11 refseq1 + 860921 861593
>NM_152486_E2 SAMD11 refseq1 + 865335 865916
>NM_152486_E3 SAMD11 refseq1 + 866219 866669
>NM_152486_E4 SAMD11 refseq1 + 870952 871476
>NM_152486_E5 SAMD11 refseq1 + 874220 875040
>NM_152486_E6 SAMD11 refseq1 + 876324 876886
>NM_152486_E7 SAMD11 refseq1 + 877316 880161

   

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
9 [报告]
发表于 2013-09-13 14:40 |只看该作者
回复 7# huang6894


    实现起来不难的,伪代码

前提你排好序,第5行相同的都挨在一起,而且$2/$3是升序。

awk 'NR==1{m=$2;n=$3;t=$5;next}{

    # 判断
     if($5==t){

    # 我说的那3种情况逐个比较,假如3个中任意1个成立,那么打印对应的值(起始值),然后赋值m=$2;n=$3;t=$5;假如没一个成立,直接打印起始值,然后赋值

     }else {

  # 打印$5不相等的。

}

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
10 [报告]
发表于 2013-09-13 17:18 |只看该作者
回复 8# jason680


    非常感谢!你帮了我大忙啊!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP