#!/usr/bin/perl
my
$dbname
;
my
@names
;
my
$format
=
'fasta'
;
my
$outfile
;
my
(
$start
,
$end
);
GetOptions(
'f|format:s'
=> \
$format
,
'o|out|outfile:s'
=> \
$outfile
,
's|sbegin|begin|start:s'
=> \
$start
,
'e|send|end|stop:s'
=> \
$end
,
'd|db|dbname:s'
=> \
$dbname
,
'i|id|seqname:s'
=> \
@names
);
if
( !
$dbname
) {
die
"need a dbname\n"
unless
@ARGV
;
$dbname
=
shift
@ARGV
;
if
(
$dbname
=~ s/^([^:]+):// ) {
push
@names
,
$dbname
;
$dbname
= $1;
}
}
my
$db
= Bio::DB::Fasta->new(
$dbname
,
-glob
=>
"*.{fa,fas,fsa,fasta,pep,aa,seq,cds,peps}"
);
if
( !
$outfile
) {
$outfile
=
pop
@ARGV
;
}
my
$out
;
if
(
$outfile
) {
$out
= Bio::SeqIO->new(
-format
=>
$format
,
-file
=>
">$outfile"
);
}
else
{
$out
= Bio::SeqIO->new(
-format
=>
$format
);
}
for
my
$nm
(
@names
) {
my
$seq
;
if
(
$start
||
$end
) {
$seq
=
$db
->seq(
$nm
,
$start
=>
$end
);
}
else
{
$seq
=
$db
->seq(
$nm
);
}
if
(
$seq
) {
my
(
$id
,
$desc
) =
split
(/\s+/,
$db
->header(
$nm
),2);
if
(
$start
&&
$end
) {
$id
=
sprintf
(
"%s_%d-%d"
,
$id
,
$start
|| 0,
$end
|| 0);
}
$out
->write_seq(Bio::PrimarySeq->new(
-display_id
=>
$id
,
-description
=>
$desc
,
-seq
=>
$seq
));
}
else
{
warn
(
"$nm not found\n"
);
}
}