美文网首页生物信息学习
实用便捷小程序--由从gff文件提取exon/intron坐标信

实用便捷小程序--由从gff文件提取exon/intron坐标信

作者: 正踪大米饭儿 | 来源:发表于2017-08-07 11:43 被阅读42次

    自己动手,丰衣足食。
    看不懂 的留言,讨论!

    #!/usr/bin/perl -w
    use strict;
    use Data::Dumper;
    
    die "Usage: perl $0 <file.gff> \n" if @ARGV < 1;
    
    my (%strand, %exon, %hash);
    open IN, $ARGV[0] || die $!;
    while(<IN>){
        chomp;
        next if /^$|^#/;
        my @a = split /\t/, $_;
        if ($a[2] =~ /CDS/){
            my ($id) = $a[8] =~ /Parent=(\S+);/;
    #        $strand{$a[0]}{$id} = $a[6];
    #        push @{$exon{$id}}, $a[3]."-".$a[4];
            $hash{$id}{chrom} = $a[0];
            $hash{$id}{strand} = $a[6];
    
            push @{$exon{$id}}, @a[3,4];
        }else{
            next;
        }
    }
    close IN;
    # print Dumper %exon;
    
    foreach my $k (sort keys %hash){
        my $chrom = $hash{$k}{chrom};
        my $strand = $hash{$k}{strand};
    
        my @pos = sort {$a<=>$b} @{$exon{$k}};
        if ( @pos > 2 ){
           print join("\t", $chrom, $pos[0], $pos[1], $strand, "exon" )."\n";
    
           for (my $i=1;$i<@pos-2;$i+=2){
               my $in_ss = $pos[$i]+1;
               my $in_ed = $pos[$i+1]-1;
    
               print join("\t", $chrom, $in_ss, $in_ed, $strand, "intron" )."\n";
               print join("\t", $chrom, $pos[$i+1], $pos[$i+2], $strand, "exon")."\n";
            } 
        }else{
            print join("\t", $chrom, $pos[0], $pos[1], $strand, "exon" )."\n";
        }
    }
    
    __END__
    Author: liupeng@genebang.com
    Date : 2017-08-07
    

    相关文章

      网友评论

      本文标题:实用便捷小程序--由从gff文件提取exon/intron坐标信

      本文链接:https://www.haomeiwen.com/subject/prwolxtx.html