我有一个 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
「*」