如何将子字符串添加到一些(不是全部)fasta headers
How to add substring to some (not all) fasta headers
我有一个如下所示的 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
我想更改 headers 使它们看起来像这样:
>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
请注意,并非所有 headers 都发生了变化,仅更改了示例中的最后 2 个,其中添加了“miRs”一词。
到目前为止,我一直这样做:
perl -p -e "s/^>/>miR-/g" seq.fasta
但这最终会导致一些 ID 添加了 miR-,即使他们已经拥有它。
我知道我可以对文件进行子集化并将其应用于那些在开始时缺少 miR- 的文件,然后重新合并,但我想找到一种更简单的方法来在一行中完成它,而无需太多手动干预。
您可以否定前瞻以仅匹配以 >
开头但后面不跟 miR-
的行。注意单引号。
perl -p -e 's/^>(?!miR-)/>miR-/g' file
你也可以说 sed
:
sed -E "s/^>(miR-)?/>miR-/" seq.fasta
用awk
可以得到没有miR
的记录:
awk '[=10=] !~ /miR-/ && [=10=] ~ /^>/' file
>LQNS02136402.1_14821_5p Parhyale hawaiensis 14821_5p
>LQNS02278094.1_35771_5p Parhyale hawaiensis 35771_5p
然后仅在这些记录中放入 miR
:
awk '[=11=] !~ /miR-/ && [=11=] ~ /^>/ {gsub(/^>/, ">miR-")} 1' file
>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
AAGAATAAGCCCGAGCAAGTCGA
我有一个如下所示的 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
我想更改 headers 使它们看起来像这样:
>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
请注意,并非所有 headers 都发生了变化,仅更改了示例中的最后 2 个,其中添加了“miRs”一词。
到目前为止,我一直这样做:
perl -p -e "s/^>/>miR-/g" seq.fasta
但这最终会导致一些 ID 添加了 miR-,即使他们已经拥有它。
我知道我可以对文件进行子集化并将其应用于那些在开始时缺少 miR- 的文件,然后重新合并,但我想找到一种更简单的方法来在一行中完成它,而无需太多手动干预。
您可以否定前瞻以仅匹配以 >
开头但后面不跟 miR-
的行。注意单引号。
perl -p -e 's/^>(?!miR-)/>miR-/g' file
你也可以说 sed
:
sed -E "s/^>(miR-)?/>miR-/" seq.fasta
用awk
可以得到没有miR
的记录:
awk '[=10=] !~ /miR-/ && [=10=] ~ /^>/' file
>LQNS02136402.1_14821_5p Parhyale hawaiensis 14821_5p
>LQNS02278094.1_35771_5p Parhyale hawaiensis 35771_5p
然后仅在这些记录中放入 miR
:
awk '[=11=] !~ /miR-/ && [=11=] ~ /^>/ {gsub(/^>/, ">miR-")} 1' file
>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
AAGAATAAGCCCGAGCAAGTCGA