Chinaunix

标题: 【求助改程序高手帮我改下这个程序】,只需输出结果中加入一些数据 [打印本页]

作者: yanglc2013    时间: 2013-04-03 16:14
标题: 【求助改程序高手帮我改下这个程序】,只需输出结果中加入一些数据
本帖最后由 yanglc2013 于 2013-04-03 18:15 编辑

因为他输出的格式是(只有lnc中的数据):
lnc-C1orf227-1:2        chr1        213028819        213031452        -

但我想在同行加上对应的refGene中的数据(附件中,下面的程序也是基于附件中的两个文件的比较。)
lnc-C1orf227-1:2        chr1        213028819        213031452        -      NM_014053        chr1        213031596        213072705        +        2210  (overlap关系)

原帖地址:http://bbs.chinaunix.net/thread-4073924-1-1.html(一下程序已经解决原帖的问题,现在想输出结果把refGene中对应的数据输出)
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use Data::Dumper;
  4. my($ref,$lnc,$contain,$overlap,$gapped,$reverse);
  5. open($ref,$ARGV[0]) or die $!;
  6. open($lnc,$ARGV[1]) or die $!;
  7. open($contain,'>','contain.txt') or die $!;
  8. open($overlap,'>','overlap.txt') or die $!;
  9. open($gapped ,'>','gapped.txt')  or die $!;
  10. open($reverse,'>','reverse.txt') or die $!;

  11. my %hRefDB;
  12. while (<$ref>){
  13.    my ($chr, $beg, $end) = (split)[1,2,3]; #Tab拆分,并取第二,第三,第四个元素。
  14.       push @{ $hRefDB{$chr}}, [$beg,$end]; #存入哈希数组。
  15. }

  16. while (<$lnc>) {
  17.    my ($chr,$beg,$end) = (split)[1,2,3];    #Tab拆分,并取第二,第三,第四个元素。
  18.    if (!exists $hRefDB{$chr}) {            
  19.        print "not exists in refDB\n";
  20.        next;
  21.    }
  22.    my $lnc = [$beg,$end];
  23.    my ($is_contain,$is_overlap,$is_reverse) = (0,0,0);
  24.    foreach my $ref (@{$hRefDB{$chr}}){       #遍历哈希数组的每个元素。
  25.        last if $is_contain and $is_overlap and $is_reverse;
  26.        unless ($is_contain){                 #除非$is_contain的值为0,否则,将is_contain($lnc,$ref)的返回值赋值给 $is_contain。
  27.             $is_contain = is_contain($lnc,$ref)
  28.             and next;
  29.        }
  30.        unless ($is_reverse){
  31.             $is_reverse = is_reverse($lnc,$ref)
  32.             and next;
  33.        }
  34.        unless ($is_overlap){
  35.             $is_overlap = is_overlap($lnc,$ref)
  36.             and next;
  37.        }
  38.    }
  39.    my $is_gapped = $is_contain || $is_reverse || $is_overlap ? 0:1;
  40.    print $contain $_ if $is_contain;
  41.    print $overlap $_ if $is_overlap;
  42.    print $gapped  $_ if $is_gapped;
  43.    print $reverse $_ if $is_reverse;
  44. }
  45. sub is_ln {
  46.     my($num,$ref) = @_;
  47.     return $num >= $ref->[0] && $num <=$ref->[1] ? 1:0;
  48. }
  49. sub is_contain {
  50.     my ($lnc,$ref) = @_;
  51.     return (is_ln($lnc->[0],$ref) && is_ln($lnc->[1],$ref)) ? 1:0;
  52. }
  53. sub is_reverse {
  54.     my ($lnc,$ref) = @_;
  55.     return is_contain($ref,$lnc);
  56. }
  57. sub is_overlap {
  58.     my ($lnc,$ref) = @_;
  59.     return (is_ln($lnc->[0],$ref) && ! is_ln($lnc->[1],$ref)) ||
  60.            (is_ln($lnc->[1],$ref) && ! is_ln($lnc->[0],$ref)) ? 1:0;
  61. }
  62. sub is_gapped {
  63.     my ($lnc,$ref) = @_;
  64.     return (! is_ln($lnc->[0],$ref) && ! is_ln($lnc->[1],$ref)) ? 1:0;
  65. }

复制代码

kk.rar

921.59 KB, 下载次数: 0


作者: rubyish    时间: 2013-04-03 22:47
lnc-HES5-1:2        chr3        14 100        -                 #gapped & overlap       

NR_026818        chr3        110 150        -        585
NR_033908        chr2        10 90        -        590
NR_027055        chr1        8 20        -        591
NM_016505        chr3        50 128        +        827
NM_001097613        chr2        11 13        -        1697

无交集输出文件 gapped
overlap nali 又有 gapped ?
作者: rubyish    时间: 2013-04-03 22:59
没有 contain 或 overlay 或 reverse
则输出 gapped

是 ma ?{:3_188:}


作者: rubyish    时间: 2013-04-03 23:19
本帖最后由 rubyish 于 2013-04-04 10:12 编辑

是否适合:

  1. ERROR!!
  2. delete
复制代码

作者: yanglc2013    时间: 2013-04-04 09:29
回复 4# rubyish [/b
嘿嘿,试试看啊。这里好多高手啊。


   
作者: yanglc2013    时间: 2013-04-04 09:34
回复 2# rubyish


    同一个染色体有overlap和有gappe 都要分别输出。
作者: rubyish    时间: 2013-04-04 12:15
老大,没看懂你这个啊。
有overlap和有gappe 都要分别输出?

有overlap = 有交集
if 无交集输出 gapped
有overlap = 没有 gappe

有overlap和有gappe 都要分别输出?
怎么写,楼主帮助下,谢谢!!
作者: yanglc2013    时间: 2013-04-04 13:01
回复 8# rubyish

因为在refGene中有比较多重复的染色体。比如有两个chr1,那么lnc中的每个chr1就必须和refGene中的两个chr1都比较。出现的情况就可能是gapped,或者和另一个出现overlap。


   
作者: yanglc2013    时间: 2013-04-04 13:04
回复 8# rubyish

就是lnc中的其中一个染色体,比如chr1,但是ref中却存在很多chr1,他们的区间都不一样。


   
作者: rubyish    时间: 2013-04-04 13:35
本帖最后由 rubyish 于 2013-04-04 10:11 编辑

3Q~
是否适合:

  1. ERROR!!
  2. delete

复制代码

作者: yanglc2013    时间: 2013-04-04 15:41
回复 11# rubyish
行啊。谢谢老大啊
作者: rubyish    时间: 2013-04-05 09:15
看懂 le
  1. #!/usr/bin/perl
  2. use 5.016;
  3. my @in    = qw/refGene.txt lncipedia_location.txt/;
  4. my @out   = qw/gapped contain overlap  reverse/;
  5. my %index = qw/gap 0 con 1 ove 2  rev 3/;
  6. my ( $r, $l ) = map { open my ($f), $_; $f } @in;
  7. my @fh = map { open my ($f), '>', $_; $f } @out;
  8. my ( %r, %l );
  9. map { @_ = split /\t/, $_, 5; push @{ $r{ $_[1] } }, [ @_[ 2, 3 ], $_ ] } <$r>;
  10. map { @_ = split; push @{ $l{ $_[1] } }, [ @_[ 2, 3 ], $_ ] } <$l>;

  11. while ( my ( $k, $v ) = each %l ) {
  12.     next unless $r{$k};
  13.     my @L = sort { $a->[0] <=> $b->[0] } @$v;
  14.     my @R = sort { $b->[1] <=> $a->[1] } @{ $r{$k} };
  15.     for my $l (@L) {
  16.         my ( $A, $B, $L, %Q ) = @$l;
  17.         for my $r ( @R ) {
  18.             my ( $C, $D, $R ) = @$r;
  19.             next if $B < $C;
  20.             last if $A > $D;
  21.             my $cor =
  22.                 ( $C <= $A and $B <= $D ) ? 'con'
  23.               : ( $A < $C  and $D < $B )  ? 'rev'
  24.               :                             'ove';
  25.             $cor eq 'ove' ? push @{ $Q{$cor} }, $R : $Q{$cor}++;
  26.         }
  27.         my $all = 0;
  28.         $all += ref $_ eq 'ARRAY' ? @$_ : $_ for values %Q;
  29.         $Q{gap}++ if @R > $all;
  30.         for ( keys %Q ) {
  31.             print { $fh[ $index{$_} ] } $L and next if $_ ne 'ove';
  32.             my @p = ( $L, @{ $Q{$_} } );
  33.             s/\r?\n$// for @p;
  34.             say { $fh[ $index{$_} ] } "@p";
  35.         }
  36.     }
  37. }
复制代码

作者: sinian126    时间: 2013-04-05 09:45
提示: 作者被禁止或删除 内容自动屏蔽
作者: rubyish    时间: 2013-04-05 09:59
yanglc2013 发表于 2013-04-04 11:41
回复 11# rubyish
行啊。谢谢老大啊

BU 行啊。
有 ERROR!!
输出有少了!
作者: yanglc2013    时间: 2013-04-05 17:37
回复 13# rubyish
老大还有gapped的呢?


   
作者: rubyish    时间: 2013-04-06 08:08
overlay, contain, reverse, gapped
lnc
|| ref
|| ref
...

gapped => BIG FILE
  1. #!/usr/bin/perl
  2. use 5.016;
  3. my @in    = qw/refGene.txt lncipedia_location.txt/;
  4. my @out   = qw/gapped contain overlap  reverse/;
  5. my %index = qw/gap 0 con 1 ove 2  rev 3/;
  6. my ( $r, $l ) = map { open my ($f), $_; $f } @in;
  7. my @fh = map { open my ($f), '>', $_; $f } @out;
  8. my ( %r, %l );
  9. map { @_ = split /\t/, $_, 5; push @{ $r{ $_[1] } }, [ @_[ 2, 3 ], $_ ] } <$r>;
  10. map { @_ = split; push @{ $l{ $_[1] } }, [ @_[ 2, 3 ], $_ ] } <$l>;

  11. while ( my ( $k, $v ) = each %l ) {
  12.     next unless $r{$k};
  13.     my @L = sort { $a->[0] <=> $b->[0] } @$v;
  14.     my @R = sort { $b->[1] <=> $a->[1] } @{ $r{$k} };
  15.     my %RO = map { $_ => $R[$_][2] } 0 .. $#R;
  16.     for my $l (@L) {
  17.         my ( $A, $B, $L, %Q ) = @$l;
  18.         my %R = %RO;
  19.         for my $ri ( 0 .. $#R ) {
  20.             my ( $C, $D, $R ) = @{ $R[$ri] };
  21.             next if $B < $C;
  22.             last if $A > $D;
  23.             my $cor =
  24.                 ( $C <= $A and $B <= $D ) ? 'con'
  25.               : ( $A < $C  and $D < $B )  ? 'rev'
  26.               :                             'ove';
  27.             push @{ $Q{$cor} }, $R;
  28.             delete $R{$ri};
  29.         }
  30.         $Q{gap} = [ values %R ] if %R;
  31.         local $, = "|| ";
  32.         print { $fh[ $index{$_} ] } $L, @{ $Q{$_} } for keys %Q;
  33.     }
  34. }
复制代码
overlay, contain, reverse
lnc
|| ref
|| ref
...
gapped
lnc
  1. #!/usr/bin/perl
  2. use 5.016;
  3. my @in    = qw/refGene.txt lncipedia_location.txt/;
  4. my @out   = qw/gapped contain overlap  reverse/;
  5. my %index = qw/gap 0 con 1 ove 2  rev 3/;
  6. my ( $r, $l ) = map { open my ($f), $_; $f } @in;
  7. my @fh = map { open my ($f), '>', $_; $f } @out;
  8. my ( %r, %l );
  9. map { @_ = split /\t/, $_, 5; push @{ $r{ $_[1] } }, [ @_[ 2, 3 ], $_ ] } <$r>;
  10. map { @_ = split; push @{ $l{ $_[1] } }, [ @_[ 2, 3 ], $_ ] } <$l>;

  11. while ( my ( $k, $v ) = each %l ) {
  12.     next unless $r{$k};
  13.     my @L = sort { $a->[0] <=> $b->[0] } @$v;
  14.     my @R = sort { $b->[1] <=> $a->[1] } @{ $r{$k} };
  15.     for my $l (@L) {
  16.         my ( $A, $B, $L, %Q ) = @$l;
  17.         for my $r ( @R ) {
  18.             my ( $C, $D, $R ) = @$r;
  19.             next if $B < $C;
  20.             last if $A > $D;
  21.             my $cor =
  22.                 ( $C <= $A and $B <= $D ) ? 'con'
  23.               : ( $A < $C  and $D < $B )  ? 'rev'
  24.               :                             'ove';
  25.             push @{ $Q{$cor} }, $R;
  26.         }
  27.         my $all = 0;
  28.         $all += @$_ for values %Q;
  29.         $Q{gap} = [] if @R > $all;
  30.         local $, = "|| ";
  31.         print { $fh[ $index{$_} ] } $L, @{ $Q{$_} } for keys %Q;
  32.     }
  33. }
复制代码





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2