从 fasta 文件中删除多个序列

Loï*_*hac 3 bash awk sed fasta

我有一个字符序列的文本文件,由两行组成:标题和下一行中的序列本身。该文件的结构如下:

>header1
aaaaaaaaa
>header2
bbbbbbbbbbb
>header3
aaabbbaaaa
[...]
>headerN
aaabbaabaa
Run Code Online (Sandbox Code Playgroud)

在另一个文件中,我有一个要删除的序列标题列表,如下所示:

>header1
>header5
>header12
[...]
>header145
Run Code Online (Sandbox Code Playgroud)

这个想法是从第一个文件中删除这些序列,因此所有这些标头+以下行。我使用 sed 执行此操作,如下所示,

while read line; do sed -i "/$line/,+1d" first_file.txt; done < second_file.txt
Run Code Online (Sandbox Code Playgroud)

它可以工作,但需要很长时间,因为我使用 sed 多次加载整个文件,而且它很大。关于如何加快这个过程的任何想法?

kva*_*our 5

您遇到的问题很容易回答,但在处理通用 fasta 文件时不会对您有帮助。Fasta 文件有一个序列头,后面跟着一行或多行,可以将这些行连接起来以表示序列。Fasta 文件格式大致遵循以下规则:

  • 描述行 (defline) 或标题/标识符行以 <greater-then> 字符 ( >) 开头,给出序列的名称和/或唯一标识符,并且还可能包含附加信息。
  • 描述行后面是标准单字母字符串中的实际序列本身。除有效字符外的任何内容都将被忽略(包括空格、制表符、星号等)。
  • 该序列可以跨越多行。
  • 多序列 FASTA 格式可以通过将多个单序列 FASTA 文件连接到一个公共文件中来获得,通常是在两个后续序列之间留一个空行。

大多数提出的方法在具有多行序列的多 fasta 上都会失败

以下内容将始终有效:

awk '(NR==FNR) { toRemove[$1]; next }
     /^>/ { p=1; for(h in toRemove) if ( h ~ $0) p=0 }
    p' headers.txt file.fasta
Run Code Online (Sandbox Code Playgroud)

这与EdMortonAnubahuva的答案非常相似,但不同之处在于文件headers.txt可能只包含标头的一部分。