9列のgff3ファイルから重複領域を削除しようとしています。perlを使ってgff3ファイルの重複領域を削除するには?
**Input file:**
scaffold591 Source gene 3322458 3376057 0.41 - . ID=g24007
scaffold591 Source transcript 3322458 3376057 0.41 - . ID=g24007.t1;Parent=g24007
scaffold591 Source transcription_end_site 3322458 3322458 . - . Parent=g24007.t1
scaffold591 Source gene 3322500 3346055 0.41 - . ID=g24007
scaffold591 Source transcript 3322500 3346055 0.41 - . ID=g24007.t1;Parent=g24007
scaffold591 Source transcription_end_site 3322500 3322500 . - . Parent=g24007.t1
scaffold591 Source gene 3377307 3513095 0.46 + . ID=g24008
scaffold591 Source transcript 3377307 3513095 0.41 + . ID=g24008.t1;Parent=g24008
scaffold591 Source transcription_end_site 3377307 3377307 . + . Parent=g24008.t1
ここでは、同じ鎖の「遺伝子」、すなわち「 - 」または「+」(第7列)を有する行のみを比較しようとしています。 「 - 」鎖(第7列)の例行1と行4
scaffold591 Source gene 3322458 3376057 0.41 - . ID=g24007
scaffold591 Source gene 3322500 3346055 0.41 - . ID=g24007
それらが同じ足場と同じから「遺伝子」であるため
。 row4の座標(列4と5)は、行1の座標の範囲内にあります。そのような場合、私のコードは、重複行4を削除し、より大きな範囲を持つrow1を保持する必要があります。二回
My code:
#!/usr/bin/perl
use warnings;
use strict;
use List::Util qw{ max };
open (IN, "<scaffold_sample.txt");
my $previous_seqid ="";
my $previous_strand;
my $previous_start;
my $previous_end;
my @gff;
my @tmp;
while (<IN>)
{
chomp;
my ($seqid,$source, $region, $start, $end, $score, $strand, $frame, $attribute) = split ("\t",$_);
@gff = ($seqid,$source, $region, $start, $end, $score, $strand, $frame, $attribute);
if ($seqid eq $previous_seqid && $strand eq $previous_strand && $region eq 'gene')
{
if($start < $previous_end && $end < $previous_end)
{
@gff = @tmp;
$previous_seqid = $gff[0];
$previous_strand = $gff[6];
$previous_start = $gff[3];
$previous_end = $gff[4];
print join "\t",@gff;
print "\n";
}
else
{
@tmp = @gff;
}
}
else
{
@tmp = ($seqid,$source, $region, $start, $end, $score, $strand, $frame, $attribute);
$previous_seqid = $seqid;
$previous_strand = $strand;
$previous_start = $start;
$previous_end = $end;
print join "\t",@tmp;
print "\n";
}
}
助けてくださいROW1とその次の行
**My expected output:**
scaffold591 Source gene 3322458 3376057 0.41 - . ID=g24007
scaffold591 Source transcript 3322458 3376057 0.41 - . ID=g24007.t1;Parent=g24007
scaffold591 Source transcription_end_site 3322458 3322458 . - . Parent=g24007.t1
scaffold591 Source gene 3377307 3513095 0.46 + . ID=g24008
scaffold591 Source transcript 3377307 3513095 0.41 + . ID=g24007.t1;Parent=g24008
scaffold591 Source transcription_end_site 3377307 3377307 . + . Parent=g24008.t1
私のコードを印刷します。
私はあなたのアプローチに似た解決策に到達しましたが、私の解決策は部分的に機能します。それは "gene"という単語を含む行だけを出力します。あなたのソリューションはうまくいきます。ありがとう。 –