【问题标题】:How to extract fasta sequences in a file which header line matches with list in another file?如何在标题行与另一个文件中的列表匹配的文件中提取fasta序列?
【发布时间】:2013-04-06 08:34:26
【问题描述】:

我是 Perl 的新手。我正在尝试从一个与另一个文件中的行匹配的文件中提取 fasta 序列。两个示例文件如下:

文件1.fasta:

>gene_44|105_nt|+|47540|47644 GTGCGCCGGCGCGTCGCGATCGCGAACCGGCCCGTGCGAATCCTGCCGCATGCGCGCCGCATCTCGCCACGCCGCGCATTTCATTTCGACATCCATAACGTCTGA

>gene_69|111_nt|+|75846|75956 ATGCCGTTGCCGTCGCGCATCGCGGCGGCCGTGCGCGGCGCGCATGCATACGCCGGCACGGCCGATGCGCGCGCGACGCGCAAACTGCACGCGGCGCGGGATTTGTGTTGA

>基因_88|177_nt|-|97993|98169
ATGCGCCAGCCGACGCACGCCCATTCCGGGCGAAACGTTCCCCTTATCCATTCGATCATCCGTGCCGCACTGCGCGAAGCGGCCACCGCCGACACGTACCAAACCGCGCTCGATGCGACCGGCGCGGCACTCGTCGCCATCGCGGCGCTCGTGCGCGCGGAGGTGCGGCATGGCTGA

>基因_90|141_nt|-|99016|99156
TTGGAAGGGCGCTTTCCGCGTGCGAGTCGTCTGACGCAGCGTTGCACGGTCTGGTCGAATCGCGAGCTTCATCGCTGGATGGCCGATCCGTTGAACTATCGCGCTGTCGACGCGGCGAACCAGACGACGGAGGGCGCGTAA

文件2.list:

somewordsinfront, >gene_44|somewordsattheback

blablabla,>gene_88|blablablablabla

我期望的输出如下:

>gene_44|105_nt|+|47540|47644 GTGCGCCGGCGCGTCGCGATCGCGAACCGGCCCGTGCGAATCCTGCCGCATGCGCGCCGCATCTCGCCACGCCGCGCATTTCATTTCGACATCCATAACGTCTGA

>基因_88|177_nt|-|97993|98169
ATGCGCCAGCCGACGCACGCCCATTCCGGGCGAAACGTTCCCCTTATCCATTCGATCATCCGTGCCGCACTGCGCGAAGCGGCCACCGCCGACACGTACCAAACCGCGCTCGATGCGACCGGCGCGGCACTCGTCGCCATCGCGGCGCTCGTGCGCGCGGAGGTGCGGCATGGCTGA

我怎样才能做到这一点?提前致谢! :)

【问题讨论】:

    标签: regex perl extract fasta


    【解决方案1】:

    下次提问时,请出示你的代码,例如

    use strict;
    use warnings;
    
    my @genes;
    
    open my $list, '<file2.list';
    while (my $line = <$list>) {
        push (@genes, $1) if $line =~ /[^>]+>([^|]+)/;
    
    }
    my $input;
    close $list;
    {
        local $/ = undef;
        open my $fasta, '<file1.fasta';
        $input = <$fasta>;
        close $fasta;
    }
    my @lines = split(/>/,$input);
    foreach my $l (@lines) {
        foreach my $reg (@genes) {
            print ">$l" if $l =~ /$reg/
        }
    }
    

    【讨论】:

    • 非常感谢@Suic。这似乎部分对我有用,但我遇到了一些问题。假设如果 file1.fasta 中有另一个标题为 ">gene_449|141_nt|-|99016|99156" 的序列,则该序列也将包含在输出文件中,实际上它不应该包含。这可能是因为 file2.list 中的字符串 'gene_44' 与之匹配,因此该序列也包含在输出中。我怎样才能摆脱它?再次感谢。
    • 你可以修复它,通过更改这一行print "&gt;$l" if $l =~ /$reg\|/;
    • @Suic- 它真的对我有用!我已经尝试了一整天来解决这个问题>.
    • @nicole,如果可行,请接受答案。请参阅meta.stackexchange.com/a/5235/163680 并欢迎来到 SO。 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 2018-05-09
    相关资源
    最近更新 更多