我有一个看起来像这样的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
,依此类推,如果可能,我也要求解释其逻辑。
>
大于符号开头,而ATGC并不是这样来区分它们。 header*
,第二个中的替换第二个标题,依此类推。预先感谢。
使用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 }
,以为每条输入行打印当前行。