免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
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
21 [报告]
发表于 2013-09-17 16:01 |只看该作者
本帖最后由 jason680 于 2013-09-17 16:04 编辑

回复 20# expert1

that's your fault not my with learning by analogy ...

  my key is k=sprintf("%s_%020d",$5,$2);

and get result as below:
# cat file1
A 10 30
A 20 40
A 50 70
A1 38 168

# awk '{k=sprintf("%s_%020d",$1,$2);for(n=0;n++<3;)a[k,n]=$n;c[k]}END{$1="";t=asorti(c,s);for(n=0;n++<t+1;){N=s[n];if($1==a[N,1]&&$3>=a[N,2]){a[N,2]=$2;if($3>a[N,3])a[N,3]=$3}else if($1)print $1,$2,$3;for(m=0;m++<3;)$m=a[N,m]}}' file1
A1 38 168
A 10 40
A 50 70

论坛徽章:
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
22 [报告]
发表于 2013-09-17 16:23 |只看该作者
回复 21# jason680


    学习了,阁下思路奇特,自愧不如啊

论坛徽章:
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
23 [报告]
发表于 2013-09-18 09:19 |只看该作者
还有一种情况没有考虑——包含,比如[1,40] [10,20]。

论坛徽章:
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
24 [报告]
发表于 2013-09-18 10:16 |只看该作者
回复 23# blackold


    啥意思黑哥?

论坛徽章:
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
25 [报告]
发表于 2013-09-18 13:40 |只看该作者
回复 24# expert1


    没仔细看,后面已经修正了。

论坛徽章:
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
26 [报告]
发表于 2013-09-22 17:15 |只看该作者
回复 25# blackold


    针对19楼我自己的问题,如下,先sort, 由于坐标$2<$3是永远成立的,那么只需要
  1. awk 'NR==1{tag=$1;start=$2;end=$3}NR>1{

  2.         if($1==tag){
  3.                                 if($2<end && $3>=end)

  4.                                 end=$3

  5.                                else if($3<end)next

  6.                               else{                                                      
  7.                         
  8.                                 print tag,start,end;start=$2;end=$3;tag=$1
  9.                                        
  10.                                 }
  11.                         
  12.                         
  13.                 }


  14.         else {                                                   
  15.                 print tag,start,end;tag=$1;start=$2;end=$3  
  16.                      
  17.                         }
  18.                         
  19.         }END{print tag,start,end}'
复制代码

论坛徽章:
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
27 [报告]
发表于 2013-09-22 20:35 |只看该作者
回复 7# huang6894


    首先sort -k5 -k2 file ,使$2(坐标起点)升序排列,由于$2<$3(起点<终点)这个是恒成立的。所以按照我的这个思路第N+1行和第N行比较,然后合并。
  1. # awk -v OFS="\t" 'NR==1{tag=$5;start=$2;end=$3;a=$6;b=$4;c=$1}NR>1{

  2.         if($5==tag){
  3.                                 if($2<end && $3>end)

  4.                                       end=$3

  5.                                else if($3<end) next

  6.                                else{                                                      
  7.                         
  8.                                    print ">"tag"_"++count,a,c,b,start,end;

  9.                                    start=$2;end=$3;tag=$5;a=$6;b=$4;c=$1
  10.                                        
  11.                                 }
  12.                         
  13.                         
  14.                 }


  15.         else {                                             
  16.                  print ">"tag"_"++count,a,c,b,start,end;

  17. tag=$5;start=$2;end=$3;a=$6;b=$4;c=$1
  18. count=0      
  19.                      
  20.                         }
  21.                         
  22.         }END{print ">"tag"_"++count,a,c,b,start,end}' <<<"refseq2 279363  280352  -       NM_001002919    FAM150B
  23. refseq2 282911  283375  -       NM_001002919    FAM150B
  24. refseq2 285923  286403  -       NM_001002919    FAM150B
  25. refseq2 286090  286543  -       NM_001002919    FAM150B
  26. refseq2 287383  288092  -       NM_001002919    FAM150B
  27. refseq2 287813  288508  -       NM_001002919    FAM150B
  28. refseq1 934142  935012  -       NM_021170       HES4
  29. refseq1 934706  935193  -       NM_021170       HES4
  30. refseq1 934872  935367  -       NM_021170       HES4
  31. refseq1 935046  935752  -       NM_021170       HES4
  32. refseq1 860921  861380  +       NM_152486       SAMD11
  33. refseq1 861102  861593  +       NM_152486       SAMD11
  34. refseq1 865335  865916  +       NM_152486       SAMD11
  35. refseq1 866219  866669  +       NM_152486       SAMD11
  36. refseq1 870952  871476  +       NM_152486       SAMD11
  37. refseq1 874220  874709  +       NM_152486       SAMD11
  38. refseq1 874455  875040  +       NM_152486       SAMD11
  39. refseq1 879088  880161  +       NM_152486       SAMD11"
复制代码
结果如下:

>NM_001002919_1 FAM150B refseq2 -       279363  280352
>NM_001002919_2 FAM150B refseq2 -       282911  283375
>NM_001002919_3 FAM150B refseq2 -       285923  286543
>NM_001002919_4 FAM150B refseq2 -       287383  288508
>NM_021170_1    HES4    refseq1 -       934142  935752
>NM_152486_1    SAMD11  refseq1 +       860921  861593
>NM_152486_2    SAMD11  refseq1 +       865335  865916
>NM_152486_3    SAMD11  refseq1 +       866219  866669
>NM_152486_4    SAMD11  refseq1 +       870952  871476
>NM_152486_5    SAMD11  refseq1 +       874220  875040
>NM_152486_6    SAMD11  refseq1 +       879088  880161

2楼也指出来了,为什么那个有重合的没合并呢,我这里是是完全合并了。

论坛徽章:
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
28 [报告]
发表于 2013-09-22 20:50 |只看该作者
回复 23# blackold


     awk -v OFS="\t" 'NR==1{tag=$5;start=$2;end=$3;a=$6;b=$4;c=$1}NR>1{

        if($5==tag){
                                if($2<end && $3>end)

                                end=$3

                               else if($3<end)next

                               else{                                                      
                        
                                print ">"tag"_"++count,a,c,b,start,end;

start=$2;end=$3;tag=$5;a=$6;b=$4;c=$1
                                       
                                }
                        
                        
                }


        else {                                             
                 print ">"tag"_"++count,a,c,b,start,end;

tag=$5;start=$2;end=$3;a=$6;b=$4;c=$1
count=0      
                     
                        }
                        
        }END{print ">"tag"_"++count,a,c,b,start,end}' <<<"refseq2 279363  280352  -       NM_001002919    FAM150B
refseq2 282911  283375  -       NM_001002919    FAM150B
refseq2 285923  286403  -       NM_001002919    FAM150B
refseq2 286090  286543  -       NM_001002919    FAM150B
refseq2 287383  288092  -       NM_001002919    FAM150B
refseq2 287813  288508  -       NM_001002919    FAM150B
refseq1 934142  935012  -       NM_021170       HES4
refseq1 934706  935193  -       NM_021170       HES4
refseq1 934872  935367  -       NM_021170       HES4
refseq1 935046  935752  -       NM_021170       HES4
refseq1 860921  861380  +       NM_152486       SAMD11
refseq1 861102  861593  +       NM_152486       SAMD11
refseq1 865335  865916  +       NM_152486       SAMD11
refseq1 866219  866669  +       NM_152486       SAMD11
refseq1 870952  871476  +       NM_152486       SAMD11
refseq1 874220  874709  +       NM_152486       SAMD11
refseq1 874455  875040  +       NM_152486       SAMD11
refseq1 879088  880161  +       NM_152486       SAMD11
mnscx 200     240     x       no           abc"c
>NM_001002919_1 FAM150B refseq2 -       279363  280352
>NM_001002919_2 FAM150B refseq2 -       282911  283375
>NM_001002919_3 FAM150B refseq2 -       285923  286543
>NM_001002919_4 FAM150B refseq2 -       287383  288508
>NM_021170_1    HES4    refseq1 -       934142  935752
>NM_152486_1    SAMD11  refseq1 +       860921  861593
>NM_152486_2    SAMD11  refseq1 +       865335  865916
>NM_152486_3    SAMD11  refseq1 +       866219  866669
>NM_152486_4    SAMD11  refseq1 +       870952  871476
>NM_152486_5    SAMD11  refseq1 +       874220  875040
>NM_152486_6    SAMD11  refseq1 +       879088  880161
>equal_1        abc     mnscx   x       1       40
>no_1   abc     mnscx   x       10      40
>no_2   abc     mnscx   x       200     240

测试完全通过

论坛徽章:
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
29 [报告]
发表于 2013-09-22 20:51 |只看该作者
回复 27# expert1


    厉害!!!学习了

论坛徽章:
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
30 [报告]
发表于 2013-09-22 22:45 |只看该作者
哦,拷贝样例的时候忘了这个 refseq1 876324  876886  +       NM_152486       SAMD11了,难怪如此,还有个E。
数据文件加上之后这些时候。结果应该是

>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 +       879088  880161
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP