使用sed命令替换fasta标头

问题描述 投票:-1回答:1

我有一个看起来像这样的fasta文件。

>header1  
ATGC....  
>header2  
ATGC...

我的列表文件看起来像这样

organism1  
organism2

并且包含我要替换标头的生物体列表。

我试图通过如下的for命令使用sed循环:

for i in `cat list7b`; do sed "s/^>/$i/g" sequence.fa; done

但是它不起作用,请告诉我如何完成此任务。

结果文件应该看起来像这样

>organism1  
ATGC...  
>organism2  
ATGC....

>header1替换为>organism_1,依此类推,如果可能,我也要求解释其逻辑。

  1. 这两个标头与ATGC区别开来,因为标头始终以>大于符号开头,而ATGC并不是这样来区分它们。
  2. 标题应替换为出现的顺序,即用文件中的第一行替换第一个header*,第二个中的替换第二个标题,依此类推。

预先感谢。

linux text-processing
1个回答
0
投票

使用awk,一次运行很容易。

假设您的fasta文件名为sequence.fa,而您的生物列表文件名为list7b,如您可以使用的问题

awk 'NR == FNR { o[n++] = $0; next } /^>/ && i < n { $0 = ">" o[i++] } 1' list7b sequence.fa > output.fa

说明:

NR == FNR是仅对第一个文件执行操作的条件。 (总记录数等于当前文件中的记录数)

[{ o[n++] = $0; next }将输入行放入数组o中,对条目进行计数并跳过对输入行的进一步处理,因此o将包含您的所有生物行。

对剩余文件执行下一部分。

[/^>/ && i < n对于以>开头的行有效,只要i小于放入数组n中的元素o的数量。

{ $0 = ">" o[i++] }将当前行替换为>,后跟数组元素(即,第一个文件中的一行),并将索引i递增到下一个元素。

[1是“始终为真”的条件,具有隐式默认操作{ print },以为每条输入行打印当前行。

© www.soinside.com 2019 - 2024. All rights reserved.