将 fasta headers 重命名为括号内的文本

Renaming fasta headers to bracketed text

我有一个包含 250 个 fasta 序列的文件。现在,它们看起来像这样:

>NP_041982.1 DNA polymerase [Enterobacteria phage T7]

我想更改 header 使其看起来像这样:

>Enterobacteria phage T7

对于每个header,我只想要括号中的in-between。我试图通过 linux 命令来做到这一点。

有人可以帮忙吗?

file.fa 内容

>Sequence One [Species 1]
actgtattagctaatcgatcagttacgattcga
tagctacgtacgtacgatcgatcagtcagctag
>Sequence Two [Species 2]
ttgtagctagctagctagctagctagctacgta
tgcatcgatcgattaatatcgcgccctaactcg
>Sequence Three
atgatagtctggtcatcgattcagtcagttcat
ttgcatgatctactagatcgatattagctagat
>Sequence Four [early bracket] text
tagctacgtacgatcgtacgatcgatcgtatat
gctagtcgactagctagctacgtacgtacgtaa

sed 命令:

sed 's@^>[^\[]*\[\([^\]*\)]$@>@g' file.fa

看起来有点绕口,但意思是…… 获取与“以 > 开头的行,后跟除 [,后跟除 ] 之外的任意数量的字符,后跟 ] 的模式匹配的任何字符串。捕获括号之间的字符串,并替换整个比赛只有括号里的东西。

打印输出

>Species 1
actgtattagctaatcgatcagttacgattcga
tagctacgtacgtacgatcgatcagtcagctag
>Species 2
ttgtagctagctagctagctagctagctacgta
tgcatcgatcgattaatatcgcgccctaactcg
>Sequence Three
atgatagtctggtcatcgattcagtcagttcat
ttgcatgatctactagatcgatattagctagat
>Sequence Four [early bracket] text
tagctacgtacgatcgtacgatcgatcgtatat
gctagtcgactagctagctacgtacgtacgtaa

可以使用

将输出保存到新文件中
sed 's@^>[^\[]*\[\([^\]*\)]$@>@g' file.fa > converted_filename.fa

请注意,任何没有匹配项的 headers 都会被打印 as-is,任何在最后一个括号之后有字符的行也会被打印 as-is。如果遇到未在同一行上关闭的左括号,可能会表现得很奇怪。我建议您仔细检查新文件的行数是否与原始文件相同。