如何将子字符串添加到某些(不是全部)fasta 标头中

Ama*_*ios 1 shell perl awk sed fasta

我有一个看起来像这样的 fasta 文件:

>miR-92|LQNS02278089.1_34108_3p  Parhyale hawaiensis 34108_3p 
AATTGCACTCGTCCCGGCCTGC
>miR-92|LQNS02278089.1_34106_3p  Parhyale hawaiensis 34106_3p 
AATTGCACTGATCCCGGCCTGC
>LQNS02136402.1_14821_5p  Parhyale hawaiensis 14821_5p 
CCGTAAGGCCGAAGACAAGAA
>LQNS02278094.1_35771_5p  Parhyale hawaiensis 35771_5p 
AAGAATAAGCCCGAGCAAGTCGAT
Run Code Online (Sandbox Code Playgroud)

我想更改标题,使它们看起来像这样:

>miR-92|LQNS02278089.1_34108_3p  Parhyale hawaiensis 34108_3p 
AATTGCACTCGTCCCGGCCTGC
>miR-92|LQNS02278089.1_34106_3p  Parhyale hawaiensis 34106_3p 
AATTGCACTGATCCCGGCCTGC
>miR-LQNS02136402.1_14821_5p  Parhyale hawaiensis 14821_5p 
CCGTAAGGCCGAAGACAAGAA
>miR-LQNS02278094.1_35771_5p  Parhyale hawaiensis 35771_5p 
AAGAATAAGCCCGAGCAAGTCGAT
Run Code Online (Sandbox Code Playgroud)

请注意,并非所有标题都发生了变化,只是示例中的最后 2 个,其中添加了“miRs”一词。到目前为止,我一直在这样做: perl -p -e "s/^>/>miR-/g" seq.fasta 但这最终会导致一些 ID 添加了 miR,即使它们已经添加了它。

我知道我可以对文件进行子集化并将其应用于那些在开始时缺少 miR- 然后重新合并的文件,但我想找到一种更简单的方法来在一行中完成它而无需太多手动干预。

P..*_*... 7

您可以否定前瞻以仅匹配以 开头>但不以miR-. 注意单引号。

perl -p -e 's/^>(?!miR-)/>miR-/g' file
Run Code Online (Sandbox Code Playgroud)