Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 使用序列ID提取FASTA序列_Perl_Design Patterns_Matching - Fatal编程技术网

Perl 使用序列ID提取FASTA序列

Perl 使用序列ID提取FASTA序列,perl,design-patterns,matching,Perl,Design Patterns,Matching,我有两个文件: 文件1: 文件2:仅序列ID 84C2_Locus_14_Transcript_1/3_Confidence_0.571_Length_1244 84C2_Locus_14_Transcript_2/3_Confidence_0.857_Length_1961 84C2_Locus_14_Transcript_3/3_Confidence_0.571_Length_1248 84C2_Locus_15_Transcript_1/9_Confidence_0.190_Length_

我有两个文件: 文件1:

文件2:仅序列ID

84C2_Locus_14_Transcript_1/3_Confidence_0.571_Length_1244
84C2_Locus_14_Transcript_2/3_Confidence_0.857_Length_1961
84C2_Locus_14_Transcript_3/3_Confidence_0.571_Length_1248
84C2_Locus_15_Transcript_1/9_Confidence_0.190_Length_757
……太多了

我的输出文件应该包含与头关联的序列。i、 e.将序列id文件头部分与原始fasta序列文件相匹配,并且这些序列头与另一个输出文件中的fasta序列头存储相匹配,该文件包含带有序列的头。如下所示:

>84C2_Locus_15_Transcript_5/9_Confidence_0.333_Length_1841
ATTTGCTCGGAAAAACACTTCTCGTGGAACTTGTTAGCGCTGAGCTTGATCCCAAGACGA......so on
原始输出文件应如下所示:

>84C2_Locus_15_Transcript_5/9_Confidence_0.333_Length_1841
ATTTGCTCGGAAAAACACTTCTCGTGGAACTTGTTAGCGCTGAGCTTGATCCCAAGACGA......so on

请用perl向我推荐适合我问题的方法。

编辑:新代码,我第一次不理解你的问题。该脚本读取这两个文件,将所有ID存储在哈希中,然后遍历第一个文件中的所有序列。只有ID位于第二个文件中的序列才会写入输出文件。请注意,输出像第一个文件中的分隔符一样使用
写入,而不像第二个文件中的id那样使用
写入。第一个文件开头缺少的
也被正确复制

#!/usr/bin/perl -w

use strict;

# Check command line arguments
unless ($#ARGV == 1 && -e $ARGV[0] && -e $ARGV[1]) {
        print STDERR "Usage: split-fasta.pl DATA IDS\n";
        exit 1;
}

my (%ids, $id);

# Read sequence IDs
open(IDS, "<$ARGV[1]") or die "Can't open IDs file: $1";

while (<IDS>) {
        $ids{$_} = 1;
}

close(IDS);


# Read sequence data and write results to output.fasta
open(DATA,    "<$ARGV[0]") or die "Can't open sequences file: $1";
open(OUTFILE, ">>output.fasta") or die "Can't open output file: $1";

while (<DATA>) {
        my $line = $_;


        if ($line =~ /^>?(\w+\|.+\n)/) {
                $id = $1;
                $id =~ tr/|/_/;
        }

        print OUTFILE $line if defined $ids{$id};
}

close(DATA);
close(OUTFILE);
#/usr/bin/perl-w
严格使用;
#检查命令行参数
除非($#ARGV==1&&&e$ARGV[0]&&e$ARGV[1]){
打印STDERR“用法:split-fasta.pl数据标识\n”;
出口1;
}
我的(%id,$id);
#读取序列ID
打开(IDS,“>output.fasta”)或死“无法打开输出文件:$1”;
而(){
我的$line=$\ux;
如果($line=~/^>?(\w+\\\.+\n)/){
$id=$1;
$id=~tr/|/|;
}
如果定义了$id{$id},则打印输出文件$line;
}
关闭(数据);
关闭(输出文件);
那么,您基本上想要将文件1拆分为多个文件,每个文件只包含一个序列?也许这段难看的Perl(可能关闭每个文件句柄,而不仅仅是最后一个…)将帮助您解决问题

#!/usr/bin/perl -w

use strict;

while (<>) {
        my $line = $_;

        if ($line =~ />?([0-9]+|\w+)\//) {
                my $file_name = $1;
                open(OUTFILE, ">>$file_name");
        }

        print OUTFILE $line;
}

close(OUTFILE);
#/usr/bin/perl-w
严格使用;
而(){
我的$line=$\ux;
如果($line=~/>?([0-9]+|\w+\/){
我的$file\u name=$1;
打开(输出文件“>>$file_name”);
}
打印输出文件$行;
}
关闭(输出文件);

编辑:如果您想输入第二个文件中的ID,只需添加另一个与第一个文件中的标题匹配的
if
。只要两个文件的顺序相同,这应该可以工作,因为输入在写入时会立即被丢弃,并且无法再进行搜索。

欢迎使用堆栈溢出!这个问题缺乏信息。你能提供你的代码吗?到目前为止,您做了哪些尝试,遇到了哪些问题?另外,你能把你发布的文件的内容减少到与问题相关的部分吗?输出文件,我只得到序列的标题部分,而不是我的文件1中的序列和标题。谢谢,实际上我希望在我的输出文件中有与序列相关的fuul标题部分。根据序列id文件,它检查序列头部分,并给出与完整序列关联的输出文件头。您所需的输出看起来与第一个输入文件相同。我错过了什么?完全正确。最终的输出文件包含根据我的序列id文件实际匹配头模式的序列。谢谢。我的要求是生成一个单独的输出文件,其中包含序列以及与序列id文件(即文件2)的头匹配的头部分。谢谢,我认为此代码对我有帮助。很高兴我能提供帮助。哦,你能点击“接受”来获得我的答案吗?谢谢。根据你的建议,我正在写你的代码,只是稍微修改一下。但是输出文件只显示头部分,而不显示序列。请检查我的代码并告诉我哪里错了/usr/bin/perl-w使用strict;my$list=$ARGV[0]| |“accessionids.txt”;my$data=$ARGV[1]||“fasta.txt”;my$outs=$ARGV[2]| |‘SQ.fas’;我的(%id,$id);打开(列表,$LIST)或死亡“无法打开文件$LIST:$!\n”;while(){$ids{$}=1;}关闭列表;打开(在$data中)或死亡“无法打开文件$data:$!\n”;;而(){my$line=$\uuu;if($line=~/^>?(\w+\\\\\\.+\n)/){$id=$1;$id=~tr/|//}关闭;打开(OUT,“>$outs”)或死亡“无法创建文件$outs:$!\n”;foreach my$id(@list){打印出“>$id\n”}结束;