如何删除 fasta 文件中每个蛋白质序列末尾的 *

如何删除 fasta 文件中每个蛋白质序列末尾的 *

我有一个 fasta 文件,其中包含特定蛋白质的多个序列(氨基酸序列)。序列的最后一个字符表示为“*”,它实际上代表终止密码子。我正在尝试使用 MUSCLE 进行多序列比对,但该工具拒绝所有末尾带有“*”的序列。

如何删除“*”?

例如我的输入文件是:

>seq1
MSDGFHS*
>Seq2
MSDRFH*

我需要的是:

>seq1
MSDGFHS
>Seq2
MSDRFH

答案1

sed。例如:

$ printf ">seq1\nMSDGFHS*\n>Seq2\nMSDRFH*\n" | sed -e 's/\*$//'
>seq1
MSDGFHS
>Seq2
MSDRFH

*这会删除行末尾的所有星号字符 ( )。

您可以使用 sed 的-i选项来编辑原始文件。或者只是将sed的输出重定向到一个新的 fasta 文件并将其用作 MUSCLE 的输入,如果您还需要将原始文件与其他程序一起使用,这将是一个更好的选择(通常最好不是永久删除信息 - 一旦删除数据,就无法保证您可以将其恢复。备份总是好的,就像出于特殊目的使用文件的临时修改版本一样)。

答案2

如果您的数据不包含*您想要保留的其他位置的 s,那么这是一项tr需要执行的工作:

$ tr -d '*' < file
>seq1
MSDGFHS
>Seq2
MSDRFH

答案3

vi作品:

vi file.txt
:1,$s/\*$//
ZZ

这告诉vi我们要寻址文件 ( ) 中的所有行,并且每当在行 ( ) 末尾找到1,$文字(由于它是正则表达式元字符而被转义)时,它就会被替换为空,即被删除。*$

正如@roaima现已删除的评论中指出的那样,搜索和替换命令可以更方便地编写为:

:%s/\*//

答案4

使用(以前称为 Perl_6)

raku -pe 's/ \* $ //;' 

输入示例:

>seq1
MSDGFHS*
>Seq2
MSDRFH*

示例输出:

>seq1
MSDGFHS
>Seq2
MSDRFH

这个时候你应该已经熟悉了s///三重固相线" 习语。以上是在 Raku 中执行的习语,Raku 是 Perl 编程语言家族的成员。该-e标志告诉 Raku 期待一个“单行”程序(而不是例如脚本文件的名称),其中strict默认情况下启用该-p标志,逐行运行代码,$_在每行末尾自动打印主题变量。

在两个左斜线字符之间,正则表达式搜索\*(反斜杠转义的)文字星号,后跟$字符串结尾零宽度断言。两个右侧的斜线字符之间没有任何内容,因此任何行尾星号都将被替换为任何内容(即删除)。

一个有趣的变化是,您可以切换到 Raku 的-ne非自动打印逐行标志,并且该s///习惯用法将逐行返回您选择进行修改/删除的内容(假设您已附加类似的打印语句say) :

raku -ne 's/ \* $ //.say;'  test.fasta
Nil
「*」
Nil
「*」

最后,如果您对生物信息学工具包没有强烈的偏好,您可以考虑生物Perl或者BioPerl6

https://raku.org

相关内容