使用 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
等等
- 这两个 header 与 ATGC 不同,因为 header 总是以
>
大于符号开头,而 ATGC 不会。这就是他们的区别。
- 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 }
以打印每个输入行的当前行。
我有一个 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
等等
- 这两个 header 与 ATGC 不同,因为 header 总是以
>
大于符号开头,而 ATGC 不会。这就是他们的区别。 - 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 }
以打印每个输入行的当前行。