我应该如何在 fasta 文件中实现条件字符串替换?

问题描述 投票:0回答:1

我有一个很大的 fasta 文件,每个序列标题中都有各种细菌物种名称,看起来像这样

文件.fasta

>Bacteria;Actinobacteria;Actinobacteria;Streptomyces;Streptomycetaceae;Streptomyces;Streptomyces_sp._AA4;
TTGGCAGTCTCTCCCGCGAACCAGGCCACTGCTGCGACCACCTCGGCTGAATCCCGCGCGCAGGCCACGGGAATCCCCGG
>Bacteria;Actinobacteria;Actinobacteria;Pseudonocardiales;Pseudonocardiaceae;Amycolatopsis;Amycolatopsis_niigatensis;
TTGGCAGTCTCTCCCGCGAACCAGGCCACTGCTGCGACCACCTCGGCTGAATCCCGCGCGCAGGCCACGGGAATCCCCGG

我想要做的是在每个标题中搜索单个物种(链霉菌),如果列出了整个标题,则将其替换为“Streptomyces”,否则将整个标题替换为“Not Streptomyces”。

new_file.fasta

>Streptomyces
TTGGCAGTCTCTCCCGCGAACCAGGCCACTGCTGCGACCACCTCGGCTGAATCCCGCGCGCAGGCCACGGGAATCCCCGG
>Not Streptomyces
TTGGCAGTCTCTCCCGCGAACCAGGCCACTGCTGCGACCACCTCGGCTGAATCCCGCGCGCAGGCCACGGGAATCCCCGG

我的第一直觉是使用 awk 或 sed 之类的东西来进行此替换,但我在弄清楚如何替换整个字符串时遇到了麻烦。

我该怎么办?

if-statement awk sed formatting fasta
1个回答
0
投票

在任何 awk 中你可以执行以下操作:

awk '/^>/{
        s="Not Streptomyces"
        n=split($0,fields,";")
        for(i=1;i<=n;i++) if (fields[i]=="Streptomyces") s="Streptomyces"
        $0=">" s
} 1
' file

或者使用 GNU awk 作为单词边界正则表达式:

gawk '/^>/ { 
            if ($0~/\<Streptomyces\>/) 
                $0="Streptomyces"
            else 
                $0="Not Streptomyces"
            }
1
' file

或更简洁地说:

gawk '/^>/ { $0=">" ($0~/\<Streptomyces\>/ ? "" : "Not ") "Streptomyces" }1' file

红宝石:

ruby -lpe 'if /^>/ then $_ = /\bStreptomyces\b/ ? ">Streptomyces" : ">Not Streptomyces" end' file 

任何这些印刷品:

>Streptomyces
TTGGCAGTCTCTCCCGCGAACCAGGCCACTGCTGCGACCACCTCGGCTGAATCCCGCGCGCAGGCCACGGGAATCCCCGG
>Not Streptomyces
TTGGCAGTCTCTCCCGCGAACCAGGCCACTGCTGCGACCACCTCGGCTGAATCCCGCGCGCAGGCCACGGGAATCCCCGG
© www.soinside.com 2019 - 2024. All rights reserved.