我最近使用 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
事实上,我对你的一个序列进行了攻击(在删除了^
但留下了之后M
)nr
并发现了几乎完美的命中,但额外的 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
,文件句柄名为$fh
ed 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 中的换行符处理”了解更多信息。