У меня есть три файла фаста.Файл1 org_seqs.fasta
>OAJ152.7_org_name
GDPQGLTGSHNFIEADSSNTRDDLYVTGNNYALNMEKFMSWYNMSVDGTFDMNLMAKRAKLRFEETIQTNPNFYYGPVTGLIARNAGYIFPGRLFRNHSLENPEGILTKSHIRHFYGIYGEEHDKRFLFDSMASPIDVTGEHEFQPPNLAGGDQRGPCPGLNALANHGYIPRNGVVSFRKVIAAINEVYGMGIDLATVLAIMGTVWTGDPLSLDPGFSIGDRDTGVNNILGNLGGLLLCFVFEVLKFASPNALASLYSTLAEPLDFVGNALSVPLLNVTCPALQDLQMGGKPFWEAIQNDFPGA
>FGT15428_org_name
SSLTRNDLYVTGNAWTMNTTLFWDFHDRADENGVLSMDLLADQAARRWNDSVSTNPAFWYGPVTGMVARNAAMFFLGRLLSNHTAEHPEGILTQDIFRKFFAVYTIPANWYRKPVEYGLVPLNLDIVSWIMKHPVLGSIGGNTGTVNSFSGLDMHNITGGVTKPIEITGRHAFKAPGRFDQRGPCPGLNALANHGYISRDGITSFAEVVTAVNQVLGMGIETALILGAMGTVWTGNPLSLNPGFSIGGAANGPDNILGNVLGLLGDLRGLQGSHNWIEAD
>EGS1524_Org_name
NAGYIFPGRFFRNYSAENPEGVLTKEIVKNFFAVYGEDGNLTYKEGWERIPENWYRMPVDYTLVQLNLDLLDFGLKYPELLSIGGNTGTVNSFTGVDIANLTEKRSLLEPTSSPIDISGEHSFQPPDFSNGDQRGPCPGLNALANHGYIPRNGVVTMADVIPAINQVYGDLMAKRAKIRFEESIATNPNFYYSTILAVMGTVFVGDVLSLAPGFSIGGFSPAVQNILGNLEGLLGEPRGLNGSHNIIEADSSNTRDDLYVTGDNTRLNLTQFIEWYQMADQDgnnGTFSMGPFTGAIAR
Файл2 single_seqs.fasta
>OAJ152.7_org_name
GDPQGLTGSHNFIEADSSNTRDDLYVTGNNYALNMEKFMSWYNMSVDGTFDMNLMAKRAKLRFEETIQTNPNFYYGPVTGLIARNAGYIFPGRLFRNHSLENPEGILTKSHIRHFYGIYGEEHDKRFLFDSMASPIDVTGEHEFQPPNLAGGDQRGPCPGLNALANHGYIPRNGVVSFRKVIAAINEVYGMGIDLATVLAIMGTVWTGDPLSLDPGFSIGDRDTGVNNILGNLGGLLLCFVFEVLKFASPNALASLYSTLAEPLDFVGNALSVPLLNVTCPALQDLQMGGKPFWEAIQNDFPGA
>FGT15428_org_name
LNALANHTQDIFRKFFAVYTIPANWYRKPVEYGLVPLNLDIVSWIMKHPVLGSIGGNTGTVNSFSGLDMHNITGGVTKPIEITGRHAFKAPGRFDQRGPCPGLNALANHGYISLTRNDLYVTGNAWTMNTTLFWDFHDRADENGVLSMDLLADQAARRWNDSVSTNPAFWYGPVTGMVARNAAMFFLGRLLSNHTAEHPEGILTQDIFRKFFAVYTI
>TGH4853.21_org_nam
PNFYYGPFTGMIARNAGYFFACRLLSNHTVGSTEDIMDRETLKSFFAVHEKDGKLVYKRGWERIPENWYRRSIDYGLISLNLDLLNLITKYPELGSIGGNMGRSHDKRLSLGLASKPIKVTGEHEFIPPNFEKGDQRGPCPGLNALANHGYISRKGVTSLVEV
Файл3 var_seqs.fasta
>OAJ152.7_org_name
GDPQGLTGSHNFIEADSSNTRDDLYVTGNNYALNMEKFMSWYNMSVDGTFDMNLMAKRAKLRFEETIQTNPNFYYGPVTGLIARNAGYIFPGRLFRNHSLENPEGILTKSHIRHFYGIYGEEHDKRFLFDSMASPIDVTGEHEFQPPNLAGGDQRGPCPGLNALANHGYIPRNGVVSFRKVIAA
>OAJ152.7_org_name
INEVYGMGIDLATVLAIMGTVWTGDPLSLDPGFSIGDRDTGVNNILGNLGGLLLCFVFEVLKFASPNALASLYSTLAEPLDFVGNALSVPLLNVTCPALQDLQMGGKPFWEAIQNDFPGA
>FGT15428_org_name
LNALANHGYISLTRNDLYVTGNAWTMNTTLFWDFHDRADENGVLSMDLLADQAARRWNDSVSTNPAFWYGPVTGMVARNAAMFFLGRLLSNHTAEHPEGILTLNALANHTQDIFRKFFAVYTIPANWYRKPVEYGLVPLNLDIVSWIMKHPVLGSIGGNTGTVNSFSGLDMHNITGGVTKPIEITGRHAFKAPGRFDQRGPCPG
Я хочу написать программу, которая сопоставляет каждую последовательность из файла file1 в файл file2 и file3 на основе следующих условий: Если заголовок fasta из файла file1 совпадает с файлом file2, то совпадает первые четыре и последние четыре их последовательностибуквы и длина, если они все совпадают, то откройте четвертый файл «copy.fasta» и добавьте в него этот заголовок и seq.Если единственный заголовок не совпадает с последовательностью, то перейдите в файл3, найдите то же самое, если условие истинно, добавьте снова в файл4, иначе откройте другой файл "var.fasta" и добавьте в него.Если заголовок fasta из file1 вообще не совпадает в file2, тогда добавьте в "single.fasta".
Я пробовал следующий скрипт, но он не работает, я не могу понять, как сохранить совпадениепоследовательности из разных файлов в хеш и используйте эти последовательности.
#! /usr/bin/perl
use warnings;
use strict 'vars';
my $file1 = "org_seqs.fasta";
my $file2 = "single_seqs.fasta";
my $file3 = "var_seqs.fasta";
my $file4 = open( COPYF, ">>", "copy.fasta" ) or die $!;
my $file5 = open( VARF, ">>", "vars.fasta") or die $!;
my $file6 = open( SINGLEF, ">>", "single.fasta") or die $!;
my %seq1 = %{ read_fasta_as_hash( $file1 ) };
my $id1 = shift;
my %seq2 = %{ read_fasta_as_hash( $file2 ) };
my $id2 = shift;
my %seq3 = %{ read_fasta_as_hash( $file3 ) };
my $id3 = shift;
my ($match, $seen);
foreach my $seq1(%seq1){
foreach my $seq2(%seq2){
foreach my $seq3(%seq3){
if( $id1 eq $id2 ){
$match = $1;
my $len1 = length($seq1{$id1});
my $len2 = length($seq2{$id2});
my $first = substr $seq1, 4; #extract first 4 characters
my $last = substr $seq1, -4; #extract last 4 characters
if(( $seq2{$id2} =~ m/^($first)(.*)($last)$/ ) && ( $len2 == $len1 )){
$seen = $1;
print COPYF $id1, "\n", $seq1{$id1}, "\n";
}
else{
open( F3, "<", $file3 ) or die $!;
if ($match){
my $len3 = length($seq3{$id3});
print COPYF $id1, "\n", $seq1{$id1}, "\n" if(( $seq3{$id3} =~ m/^($first)(.*)($last)$/ ) && ( $len3 == $len1 ));
}
else{
print VARF $id1, "\n", $seq1{$id1}, "\n";
}
}
}
else{
print SINGLEF $id1, "\n", $seq1{$id1}, "\n";
}
}
}
}
close(COPYF);
close(VARF);
close(SINGLEF);
sub read_fasta_as_hash {
my $file = shift;
my $id = '';
my $seq = ();
my %seq;
open FH, "$file" or die $!;
while(my $line = <FH>){
chomp $line;
if ($line =~ /^>(.*)/){
$id = $1;
}
else{
$seq{$id} .= $line;
}
}
close(FH);
return \%seq;
}
exit;
Ошибка, которую я получаю:
Use of uninitialized value $id1 in print at fasta_match.pl line 53.
Use of uninitialized value in print at fasta_match.pl line 53.
Use of uninitialized value $id2 in regexp compilation at fasta_match.pl line 30.
Use of uninitialized value $id1 in pattern match (m//) at fasta_match.pl line 30.
Use of uninitialized value $id1 in hash element at fasta_match.pl line 33.
Use of uninitialized value $id2 in hash element at fasta_match.pl line 34.
Use of uninitialized value $id2 in hash element at fasta_match.pl line 34.
Пожалуйста, помогите мне исправить этот скрипт.Большое спасибо!