设为首页 收藏本站
查看: 818|回复: 0

[经验分享] shell和perl对区间交集处理(坐标区间有重叠,则合并之并取其最小的起始坐标和最大的终止坐标)

[复制链接]

尚未签到

发表于 2015-12-28 09:30:26 | 显示全部楼层 |阅读模式
  -----------------------------------------------------------
处理数据:
refseq1 8  13  +       NM_152486       SAMD11
refseq1 6  11  +       NM_152486       SAMD11
refseq1 14  16  +       NM_152486       SAMD11
refseq1 6  12  -       NM_021170       HES4
refseq1 8  10  -       NM_021170       HES4
refseq2 9  11  -       NM_001002919    FAM150B
refseq2 3  8  -       NM_001002919    FAM150B
--------------------------------------------------------
期望得到的结果是:
refseq1 6  13  +       NM_152486_E1       SAMD11
refseq1 14  16  +       NM_152486_E2       SAMD11
refseq1 6  12  -       NM_021170_E1       HES4
refseq2 9  11  -       NM_001002919_E1    FAM150B
refseq2 3  8  -       NM_001002919_E2    FAM150B
------------------------------------------------------



1 ----------------------------------------------------------------------------------------
2 #!/usr/bin/perl
3 my %R;
4 while () {
5     my @s = split;
6     push @{ $R{ $s[4] }{R} }, [ $s[1], $s[2] ];
7     $R{ $s[4] }{ $s[1] } = [ @s[ 0, 3, 4, 5 ] ];
8 }
9
10 while ( my ( $k, $v ) = each %R ) {
11     my @tmp = sort { $a->[0] <=> $b->[0] } @{ $v->{R} };
12     my ( $E, @R ) = ( 1, shift @tmp );
13     for my $t (@tmp) {
14         $t->[0] > $R[-1][1] && push @R, $t and next;
15         $t->[1] > $R[-1][1] && ( $R[-1][1] = $t->[1] )
16     }
17     for my $R (@R) {
18         my ( $A, $B, $C, $D ) = @{ $v->{ $R->[0] } };
19         print join( "\t", $A, @$R, $B, "${C}_E" . $E++, $D ) . $/;
20     }
21 }
22 -------------------------------------------------------------------------------


1 -------------------------------------------------------------------------------
2 use strict;
3 use warnings;
4
5 my @name_array ;
6 my $hash;
7 while(){
8         #get serial from each line
9         my ($seq,$min,$max, $sign, $serial, $name) = split(/\s+/);
10
11         #in Python ,use in  for convince
12         unless (grep $_->[2] eq $serial ,@name_array){
13                 push  @name_array, [$seq,$sign,$serial,$name];
14         } ;
15
16         ($min,$max) = ($max,$min) if $min > $max ;        
17
18         if($hash->{$serial}){
19                 sort_matrix($min,$max,$hash->{$serial});
20         }
21         else{
22                 push @{$hash->{$serial}},[$min,$max];
23         }
24        
25 }
26 ###print sort result
27 for my $item( @name_array ){
28         my $serial = $item->[2];
29         for (0..$#{$hash->{$serial}}){
30                 print $item->[0]," ",$hash->{$serial}->[$_][0]," ",$hash->{$serial}->[$_][1]," ",$item->[1]," ",$serial,"_E",($_+1)," ",$item->[3],"\n";
31         }
32 }
33
34 sub sort_matrix{
35         my ($cur_min,$cur_max,$matrix) = @_;
36         # record index  
37         my @splice_index;
38         for (0..$#$matrix){
39                 my $item_min = $matrix->[$_]->[0];
40                 my $item_max = $matrix->[$_]->[1];
41                 next if $cur_max < $item_min or $cur_min > $item_max;
42                 return if $cur_min >= $item_min and $cur_max <= $item_max;
43                 $cur_min  = $cur_min < $item_min ? $cur_min : $item_min;
44                 $cur_max = $cur_max < $item_max ? $item_max : $cur_max;      
45                 push @splice_index, $_;
46         }
47         push @$matrix,[$cur_min,$cur_max];
48         #print "@splice_index\n";
49
50         for (0..$#splice_index){
51                 splice(@$matrix,$splice_index[$_]-$_,1);##This is trick
52         }
53         #print $cur_min,":",$cur_max,"\n";
54 }


1 首先sort -k5 -k2 file ,使$2(坐标起点)升序排列,由于$2<$3(起点<终点)这个是恒成立的。所以按照我的这个思路第N+1行和第N行比较,然后合并。
2 # awk -v OFS="\t" 'NR==1{tag=$5;start=$2;end=$3;a=$6;b=$4;c=$1}NR>1{
3
4         if($5==tag){
5                                 if($2end)
6
7                                       end=$3
8
9                                else if($3
10
11                                else{                                                      
12                        
13                                    print ">"tag"_"++count,a,c,b,start,end;
14
15                                    start=$2;end=$3;tag=$5;a=$6;b=$4;c=$1
16                                       
17                                 }
18                        
19                        
20                 }
21
22
23         else {                                             
24                  print ">"tag"_"++count,a,c,b,start,end;
25
26 tag=$5;start=$2;end=$3;a=$6;b=$4;c=$1
27 count=0      
28                     
29                         }
30                        
31         }END{print ">"tag"_"++count,a,c,b,start,end}' <<<"refseq2 279363  280352  -       NM_001002919    FAM150B
32 refseq2 282911  283375  -       NM_001002919    FAM150B
33 refseq2 285923  286403  -       NM_001002919    FAM150B
34 refseq2 286090  286543  -       NM_001002919    FAM150B
35 refseq2 287383  288092  -       NM_001002919    FAM150B
36 refseq2 287813  288508  -       NM_001002919    FAM150B
37 refseq1 934142  935012  -       NM_021170       HES4
38 refseq1 934706  935193  -       NM_021170       HES4
39 refseq1 934872  935367  -       NM_021170       HES4
40 refseq1 935046  935752  -       NM_021170       HES4
41 refseq1 860921  861380  +       NM_152486       SAMD11
42 refseq1 861102  861593  +       NM_152486       SAMD11
43 refseq1 865335  865916  +       NM_152486       SAMD11
44 refseq1 866219  866669  +       NM_152486       SAMD11
45 refseq1 870952  871476  +       NM_152486       SAMD11
46 refseq1 874220  874709  +       NM_152486       SAMD11
47 refseq1 874455  875040  +       NM_152486       SAMD11
48 refseq1 879088  880161  +       NM_152486       SAMD11"
49 --------------------------------------------------------------------------
50 # cat file1
51 A 10 30
52 A 20 40
53 A 50 70
54 A1 38 168
55
56 # awk '{k=sprintf("%s_0d",$1,$2);for(n=0;n++<3;)a[k,n]=$n;c[k]}END{$1="";t=asorti(c,s);for(n=0;n++=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
57 A1 38 168
58 A 10 40
59 A 50 70
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-157272-1-1.html 上篇帖子: 用Eclipse搭建 C/C++, Python, Perl, Tex等平台 下篇帖子: win7 安装eclips 并添加perl脚本
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表