perl输出基因的位置信息按照基因所在染色体,和位置信息排序

perl输出基因的位置信息按照基因所在染色体,和位置信息排序

我们在整理基因组的gff文件,想输出基因的位置信息,以及基因所对应的多个转录本信息,需要对基因按照染色体排序,这里使用到了perl里面hash按照值来排序,而且还用了两个值基因型排序。示例代码如下,以下代码可以从gff文件当中提取所有基因的位置信息以及对应的多个转录本信息:


attachments-2018-12-HRJtjku45c126dd6ab1ee.jpg


perl代码如下:

#!/usr/bin/perl -w
use strict;
use Cwd qw(abs_path getcwd);
use Getopt::Long;
use Data::Dumper;

die "perl $0 <gff> <outfile>" unless(@ARGV==2);


my$gff=$ARGV[0];
my%gene=();
my%gene_region=();
my%mRNA2Gene=();
my%Gene2mRNA=();
open IN,"$gff" or die "$!";
open OUT ,">$ARGV[1]" or die "$!";
print OUT "#gene_ID\tchr\tstart\tend\tstrand\ttranscript_id\n";
while(<IN>){
chomp;
next if (/^#/);
my@tmp=split(/\t/);


if($tmp[2] =~/^gene/){
my($id)=($tmp[8]=~/ID=([^;]+)/);
$gene{$id}=1;
$gene_region{$id}=[$tmp[0],$tmp[3],$tmp[4],$tmp[6]];


#print "gene:$id\n";
#my$gene_chr->{$id}=$tmp[0];
}
if($tmp[2] =~/mRNA|transcript/i){
my($id)=($tmp[8]=~/ID=([^;]+)/);
my($pid)=($tmp[8]=~/Parent=([^;]+)/);


if(exists $gene{$pid}){

push @{$Gene2mRNA{$pid}},$id;
}
#print "mRNA:$id\n";
}
}
close(IN);
#多层排序,先按染色体排序,再按基因位置排序
for my$id(sort {$gene_region{$a}->[0] cmp $gene_region{$b}->[0] 
or $gene_region{$a}->[1] <=> $gene_region{$b}->[1] } keys %gene_region){
print OUT "$id\t".join("\t",(@{$gene_region{$id}},sort @{$Gene2mRNA{$id}})    )."\n";
}
close(OUT);



更多生物信息perl语言学习视频课程:《perl入门》《perl高级编程


  • 发表于 2018-12-13 22:26
  • 阅读 ( 5805 )
  • 分类:perl

0 条评论

请先 登录 后评论
omicsgene
omicsgene

生物信息

698 篇文章

作家榜 »

  1. omicsgene 698 文章
  2. 安生水 347 文章
  3. Daitoue 167 文章
  4. 生物女学霸 120 文章
  5. xun 82 文章
  6. 红橙子 78 文章
  7. rzx 74 文章
  8. CORNERSTONE 72 文章