从 fasta 文件中删除特殊字符

从 fasta 文件中删除特殊字符

我最近使用 awk 线性化了一个 fasta 文件。输出是完美的。然而,我的序列中有一个插入符号(^)。我想删除这个插入符号。以下是我的尝试,非常感谢任何帮助。

>P1
MPPRRSIVEVKVLDVQKRRVPNKHYVYIIRVTWSSGATEAIYRRYSKFFDLQMQMLDKFP^MMEGGQKDPKQRIIPFLPGKILFRRSHIRDVAVKRLIPIDEYCKALIQLPPYISQCDEVLQ^MFFETRPEDLNPPKEEHIGKKKSGNDPTSVDPM
>P2
MAEVRKFTKRLSKPGTAAELRQSVSEAVRGSVVLEKAKLVEPLDYENVITQRKTQIYSDP^MLRDLLMFPMEDISISVIGRQRRTVQSTVPEDAEKRAQSLFVKECIKTYSTDWHVVNYKYE^MDFSGDFRMLPCKSLRPEKIPNHVFEIDEDCEK
>P3
GDDSEWLKLPVDQKCEHKLWKARLSGYEEALKIFQKIKDEKSPEWSKYLGLIKKFVTDS^MNAVVQLKGLEAALVYVENAHVAGKTTGEVVSGVVSKAKELGIEICLMYVEIE^MKGESVQEELLKGLDNKNPKIIVACIETLRKALS

我尝试使用:

$ sed '/s: ^// seq2.fa>seq3.fa

上面的代码给了我一个错误,表示sed:e expression #1,char7: unkown command: '/' 感谢任何帮助,谢谢。

答案1

sed 's/\^//' seq2.fa>seq3.fa(删除每行上的第一个插入符)或sed 's/\^//g' seq2.fa>seq3.fa(删除每行中的所有插入符)就是您要寻找的。

答案2

如果您想删除^文件中任何位置的所有字符,您可以tr像这样使用:

tr -d '^' <seq2.fa >seq3.fa

tr实用程序是操作单个字符的最有效的工具。它可以删除、替换或“挤压”(用单个字符替换多个连续字符)字符。但是,它不允许您使用任何逻辑。

如果您只想从任何序列行中删除字符并避免触及 fasta 标题行:

sed '/^>/! s/\^//g' <seq2.fa >seq3.fa

这会在任何不以字符开头的行上触发替换命令s/\^//g(我相信您尝试使用该命令,但斜杠的顺序略有错误)>。替换^通过重复地用任何内容替换它来删除该行上的任何字符,直到没有留下这样的字符。

需要^转义,否则它会充当锚点,将正则表达式锚定到行的开头。

答案3

这些不是插入符 ( ^)。 Windows 系统使用\r\n(回车后跟换行符)来指示行的结束,这与仅使用\n.通常\r表示为^M。参见示例:

$ printf 'a\r\n' | cat -v
a^M

事实上,我对你的一个序列进行了攻击(在删除了^但留下了之后Mnr并发现了几乎完美的命中,但额外的 Ms 是间隙:

爆炸结果显示女士错了

我猜您在 Windows 系统上对此文件做了一些操作,这就是您看到的添加\r或的内容。^M请注意每个示例在您的示例中的^实际情况。^M正如上面的爆炸所证实的那样,那些不是真正的蛋氨酸,您想要删除M以及^.所以尝试这样的事情:

tr -d '\r' < seq2.fa > seq3.fa

或者,如果您对文件所做的处理已输入文字^and M,则删除两者:

sed 's/\^M//g' seq2.fa > seq3.fa

如果你只是删除它,^你会得到一个带有额外蛋氨酸的错误序列。

答案4

使用(以前称为 Perl_6)

~$ raku -e 'my $data = 1; my $fh = open($*OUT, :nl-out("\n\r")); $fh.put: $data;' | od -bc
0000000   061 012 015
           1  \n  \r
0000003
~$ raku -e 'my $data = 1; my $fh = open($*OUT, :nl-out("\n")); $fh.put: $data;' | od -bc
0000000   061 012
           1  \n
0000002

OP遇到的问题是由于行尾处理不当造成的。为了正确执行行尾处理,您需要一种可以控制此参数的语言。幸运的是,Raku 就是这样一种语言。

上面,数据存储在变量 中$data,文件句柄名为$fhed open。这状语参数:nl-out用于设置输出终止符(\n\r或),并且使用正确的终止符\n将数据输出到 stdout 上。$*OUT

因此,如果您有 FASTA 文件,您可以设置正确的:nl-out("\n")终止符以在 Unix/Linux 系统上重新打开文件。当然,您可能会对此感到不知所措,请参见下文。这就是大家!

~$ raku -e 'my $data = 1; my $fh = open($*OUT, :nl-out("thats-all-folks")); $fh.put: $data;' | od -bc
0000000   061 164 150 141 164 163 055 141 154 154 055 146 157 154 153 163
           1   t   h   a   t   s   -   a   l   l   -   f   o   l   k   s
0000020
~$ raku -e 'my $data = 1; my $fh = open($*OUT, :nl-out("")); $fh-eol.put: $data;' | od -bc
0000000   061
           1
0000001

(类似的状语参数named:nl-in用于控制读取文件时如何解释换行符进入乐。但由于 Raku 默认情况下会自动咀嚼,因此它的重要性要低得多)。

参见页面:“Raku 中的换行符处理”了解更多信息。

https://raku.org

相关内容