【问题标题】:Replace fasta headers using sed command使用 sed 命令替换 fasta 标头
【发布时间】:2020-03-13 12:19:47
【问题描述】:

我有一个类似这样的 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* 替换为文件中的第一行,第二个标题中的第二个,依此类推。

如果可能,我还要求解释逻辑。 提前致谢。

【问题讨论】:

  • edit您的问题并解释您如何区分header1header2等行与ATGC....行。我假设这两行organism1organism2是你的文件list7b。您如何定义哪条organism* 行将替换哪条header* 行?通过一个常见的尾随数字,例如header 1 -> organism 1 等等?或者按出现的顺序,即第一个 header* 替换为文件中的第一行,第二个 header* 替换为第二行等?
  • @Bodo 感谢您的快速回复。我已经重新编辑了这个问题,我希望这能帮助你理解这个问题。如果编辑不够,请随时询问,非常感谢您为帮助我所付出的时间和努力。

标签: linux text-processing


【解决方案1】:

使用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 将包含您所有的有机体行。

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

/^&gt;/ &amp;&amp; i &lt; n 对以&gt; 开头的行有效,只要i 小于放入数组o 的元素数量n

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

1 是一个“始终为真”的条件,隐含默认操作 { print } 为每个输入行打印当前行。

【讨论】:

  • 非常感谢@bodo,感谢您的帮助和宝贵的时间,这对我帮助很大。
猜你喜欢
  • 1970-01-01
  • 2015-10-07
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
  • 2013-10-11
  • 1970-01-01
  • 2019-05-25
相关资源
最近更新 更多