如何删除文件中每次出现的“>”和“细菌”一词之间的部分?

如何删除文件中每次出现的“>”和“细菌”一词之间的部分?

我想删除文件中每次出现的>和 单词之间的部分。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;

https://docs.raku.org/language/regexes
https://raku.org/

答案4

我会用grep反而。如果你只想要细菌系,

grep -o 'Bact.*$' file.fa

如果所需内容可能是第一个空格后面的任何内容,则可以使用(尽管它包括前导空格):

grep -o ' .*$' file.fa

如果您只想以“>”开头的行并匹配任何尾随内容,则需要执行两个步骤:

grep '^>.*$' file.fa | grep -o ' .*$'

相关内容