我想删除文件中每次出现的>
和 单词之间的部分。Bacteria
- 这是输入的示例:
>AADV02000003.105686.107093 Bacteria;Cyanobacteria;Cyanobacteriia;Cyanobacteriales;
- 结果应该是这样的:
>Bacteria;Cyanobacteria;Cyanobacteriia;Cyanobacteriales;
这是一个 FASTA 文件(生物信息学中的常见文件格式),因此>
始终是该行的第一个非空白字符,并且只有一这样的性格就行。
我正在考虑使用sed
但我不确定如何设置该命令。感谢您的帮助。
答案1
假设这是一个 fasta 文件,具有多个标头和序列行,其中标头以 a 开头>
,并且>
只能作为一行的第一个非空白字符出现,您可以执行以下操作:
sed 's/^ *>[^ ]* />/' file.fa
这将查找以 0 个或多个空格开头,然后是 a>
和 的行,替换从行开头到>
和 直到第一个空格的所有内容>
,有效地删除第一个空格之前的所有内容。
要编辑原始文件而不是将其打印到标准输出,请使用:
sed -i.bak 's/^ *>[^ ]* />/' file.fa
这将创建一个名为 的文件file.fa.bak
,该文件将是原始文件的副本。
答案2
使用sed
$ sed 's/[A-Z][^ ]* //' input_file
>Bacteria;Cyanobacteria;Cyanobacteriia;Cyanobacteriales;
答案3
使用乐(以前称为 Perl_6)
raku -pe 's/^ \> <(.+?)> Bacteria\; //;'
简而言之,使用 Raku 的-pe
自动打印逐行标志,并结合熟悉的s///
替换运算符。运算符的左半部分搜索 4 个正则表达式原子、零宽度^
字符串开头原子、转义的反斜杠\>
、非贪婪的.+?
任意字符一次或多次,后跟单词Bacteria\;
。
非贪婪.+?
原子被包裹在<(
…中)>
,这是 Raku 的捕获标记。搜索所有四个原子(元素),但仅<(.+?)>
捕获用于替换运算符右半部分的替换。
最后,替换运算符的右半部分不包含任何字符,这告诉 Raku 捕获并删除它(“替换为空”)。
输入示例:
>AADV02000003.105686.107093 Bacteria;Cyanobacteria;Cyanobacteriia;Cyanobacteriales;
示例输出:
>Bacteria;Cyanobacteria;Cyanobacteriia;Cyanobacteriales;
答案4
我会用grep反而。如果你只想要细菌系,
grep -o 'Bact.*$' file.fa
如果所需内容可能是第一个空格后面的任何内容,则可以使用(尽管它包括前导空格):
grep -o ' .*$' file.fa
如果您只想以“>”开头的行并匹配任何尾随内容,则需要执行两个步骤:
grep '^>.*$' file.fa | grep -o ' .*$'