使用 sed 命令替换 fasta headers

Replace fasta headers using sed command

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

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

我的列表文件如下所示

organism1  
organism2

并包含我想用其替换 header 的生物体列表。

我尝试使用 sed 命令来使用 for 循环,如下所示:

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

但是没有成功请告诉我如何完成这个任务。

结果文件应如下所示

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

也就是>header1换成>organism_1等等

  1. 这两个 header 与 ATGC 不同,因为 header 总是以 > 大于符号开头,而 ATGC 不会。这就是他们的区别。
  2. header 行应按出现顺序替换,即第一个 header* 替换为文件中的 first-line,第二个 header 替换为第二个,依此类推.

如果可能的话,我也要求解释一下逻辑。 提前致谢。

使用 awk 这很容易在一个 运行 中完成。

假设你的 fasta 文件被命名为 sequence.fa 并且你的生物列表文件被命名为 list7b 正如你可以使用

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

解释:

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

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

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

/^>/ && i < n 对于以 > 开头的行有效,只要 i 小于放入数组 [=16] 的元素数 n =].

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

1 是一个 "always true" 条件,带有隐式默认操作 { print } 以打印每个输入行的当前行。