gff文件解析

filter_gff3_by_transcript_id.pl

#!/usr/bin/perl
# by lhtk : lhtk80t7@gmail.com
use strict;
use warnings;

use Bio::Tools::GFF;
use feature 'switch';
use experimental 'smartmatch';
#use Getopt::Long;

my $transcript_id_file = $ARGV[0];
my $gff_in = $ARGV[1];
my $gff_out = $ARGV[2];

die "根据 transcript_id 来过滤 gff3 文件。\n\nUsage:\n\t$0 transcript_id_file gff3_in gff3_out\n" unless (defined $transcript_id_file and defined $gff_in and defined $gff_out);
die "文件已存在!" if ((-e $gff_out) and ($gff_out ne 'tmp.gff3'));

open IDS, '<', $transcript_id_file or die $!;
my %transcript_ids;
my %gene_ids;
while (<IDS>) {
    next if /^\s*$/;
    chomp;
    $transcript_ids{$_} = 1;
    my $gid = (split /\./, $_)[0];
    $gene_ids{$gid} = 1;
}
close IDS;
print "Get transcript_ids and gene_ids.\n\n";

# debug
# while (my($k,$v) = each %transcript_ids) {
#     print "$k => $v\n";
# }
# while (my($k,$v) = each %gene_ids) {
#     print "$k => $v\n";
# }

my $gffio_i = Bio::Tools::GFF->new(-file => $gff_in, -gff_version => 3);
my $gffio_o = Bio::Tools::GFF->new(-file => '>' . $gff_out, -gff_version => 3);

while (my $f = $gffio_i->next_feature()) {
    # debug
    # print $f->primary_tag(), "\n";

     given ($f->primary_tag()) {
         when (/predicted_gene/) {
             # my $id = $f->primary_id(); # 也可以
             my ($id) = $f->get_tag_values('ID');
             # print "$id\n"; # debug
             next unless exists $gene_ids{$id};
         }
         when (/mRNA/) {
             my ($id) = $f->get_tag_values('ID');
             next unless exists $transcript_ids{$id};
         }
         when (/exon|CDS/) {
             my ($parent) = $f->get_tag_values('Parent');
             next unless exists $transcript_ids{$parent};
         }
         default {
             die "Do you know this? -- ", $f->primary_tag(), "\n";
         }
     }
     $gffio_o->write_feature($f);
}
$gffio_i->close();
$gffio_o->close();

print "Done!\n";


获取 gff 文件第一列数据:$feat->seq_id(),更多请参考Bio::SeqFeature::Generic

转载于:https://my.oschina.net/u/727594/blog/624989

### 回答1: 可以使用bedtools软件包中的命令将gff文件转换为bed文件。具体步骤如下: 1. 安装bedtools软件包。 2. 使用以下命令将gff文件转换为bed文件: ``` bedtools convert -i input.gff -o bed > output.bed ``` 其中,input.gff是输入的gff文件名,output.bed是输出的bed文件名。 如果需要转换特定类型的gff记录,可以添加`-t`选项和记录类型参数,例如: ``` bedtools convert -i input.gff -t exon -o bed > output.bed ``` 以上命令将只转换gff中的exon记录。 更多关于bedtools的用法详见官方文档:https://bedtools.readthedocs.io/en/latest/。 ### 回答2: gff文件和bed文件是生物信息学领域中常用的两种文件格式,用于描述基因组的注释信息。 gff文件是一种文本文件,用来存储基因组的注释信息,其中每一行记录了一个基因或转录本的信息,包括位置、方向、类型以及其他相关注释。而bed文件也是一种文本文件,用来描述基因组的区域信息,包括染色体名称、起始位点、终止位点等。 要将gff文件转换为bed文件,可以按照以下步骤进行: 1. 打开gff文件,逐行读取每一条记录。 2. 解析每条记录的信息,提取出染色体名称、起始位点和终止位点等关键信息。 3. 将提取到的信息按照bed文件的格式进行整理,包括染色体名称、起始位点、终止位点等。 4. 将整理好的bed信息写入到新的bed文件中。 需要注意的是,由于gff文件和bed文件的格式不同,需要进行信息的转换和整理。另外,还需要注意gff文件中的注释信息可能会有一些额外的字段,需要根据需要决定是否保留在转换后的bed文件中。 总之,将gff文件转换为bed文件需要逐行读取、解析和整理信息,并将结果写入新的文件中,以实现格式的转换和数据的转移。 ### 回答3: GFF(General Feature Format)文件和BED(Browser Extensible Data)文件是两种常用的基因组注释文件格式。如果需要将GFF文件转换为BED文件,可以采用以下步骤: 1. 首先,打开GFF文件并读取其中的注释信息。GFF文件包含了每个特征的位置、类型、方向等信息。 2. 然后,创建一个新的BED文件,并按照BED文件的格式定义每一行的信息。BED文件通常包含三个列:染色体名称、起始位置、结束位置。 3. 对于每个注释特征,提取其染色体名称、起始位置和结束位置,并将其写入到BED文件对应的行中。 4. 保存并关闭BED文件,完成GFF文件到BED文件的转换。 需要注意的是,GFF文件和BED文件在注释信息上有所不同。GFF文件的注释信息更加详细,包含了更多的属性,如基因名称、外显子边界等。而BED文件只保留了最基本的位置信息。因此,在转换过程中,可能会有部分信息的丢失。 此外,也可以使用一些生物信息学软件或脚本来实现GFF到BED的转换。常用的软件包括BEDTools、Bioconductor中的GenomicFeatures等,它们提供了一系列的函数和工具,能够方便地进行基因组注释文件的转换和处理。 总之,将GFF文件转换为BED文件可以通过解析GFF文件中的注释信息,并按照BED文件的格式重新组织和保存数据实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值