免费注册 查看新帖 |

Chinaunix

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

【求助改程序高手帮我改下这个程序】,只需输出结果中加入一些数据 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 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

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
17 [报告]
发表于 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. }
复制代码

论坛徽章:
0
16 [报告]
发表于 2013-04-05 17:37 |只看该作者
回复 13# rubyish
老大还有gapped的呢?


   

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
15 [报告]
发表于 2013-04-05 09:59 |只看该作者
yanglc2013 发表于 2013-04-04 11:41
回复 11# rubyish
行啊。谢谢老大啊

BU 行啊。
有 ERROR!!
输出有少了!
sinian126 该用户已被删除
14 [报告]
发表于 2013-04-05 09:45 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
13 [报告]
发表于 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. }
复制代码

论坛徽章:
0
12 [报告]
发表于 2013-04-04 15:41 |只看该作者
回复 11# rubyish
行啊。谢谢老大啊

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
11 [报告]
发表于 2013-04-04 13:35 |只看该作者
本帖最后由 rubyish 于 2013-04-04 10:11 编辑

3Q~
是否适合:

  1. ERROR!!
  2. delete

复制代码

论坛徽章:
0
10 [报告]
发表于 2013-04-04 13:04 |只看该作者
回复 8# rubyish

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


   

论坛徽章:
0
9 [报告]
发表于 2013-04-04 13:01 |只看该作者
回复 8# rubyish

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


   
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP