如何在 fasta 文件的每个 header 中附加文件名?

How can I attach in each header of a fasta file the filename?

亲爱的,我有成千上万的 fasta 文件。当您打开每个文件时,您会看到 headers 如下所示:

>LOC_1_22 # 16427 # 16873 # 1 # ID=1_22;partial=00;start_type=ATG;rbs_motif=GGAG/GAGG;rbs_spacer=5-10bp;gc_cont=0.635
ATGTTCTTTTATTGCCCGAAGACTGGCGGCTTTTACTCTCCAGAGGTACATGGTGAACAAATGCCAGCGG

>LOC_1_23 # 16964 # 18139 # 1 # ID=1_23;partial=00;start_type=ATG;rbs_motif=GGA/GAG/AGG;rbs_spacer=5-10bp;gc_cont=0.651
ATGGCCGCTGACCAATATCATCACGGTGTCCGGGTCCAAGAGATCAATGACGGGACCCGCCCCATTCGCA

我想将文件名附加到每个文件的 headers。 假设我的文件名是 NC_003245 那么我想要这个文件的 headers 当我打开文件时看起来像这样

>NC_003245 LOC_1_22 # 16427 # 16873 # 1 # ID=1_22;partial=00;start_type=ATG;rbs_motif=GGAG/GAGG;rbs_spacer=5-10bp;gc_cont=0.635
ATGTTCTTTTATTGCCCGAAGACTGGCGGCTTTTACTCTCCAGAGGTACATGGTGAACAAATGCCAGCGG

>NC_003245 LOC_1_23 # 16964 # 18139 # 1 # ID=1_23;partial=00;start_type=ATG;rbs_motif=GGA/GAG/AGG;rbs_spacer=5-10bp;gc_cont=0.651
ATGGCCGCTGACCAATATCATCACGGTGTCCGGGTCCAAGAGATCAATGACGGGACCCGCCCCATTCGCA

我的bash/awk语言知识有限, 非常感谢任何帮助或建议

一个awk想法:

awk 'sub(/^>/,"") { [=10=]=">" FILENAME " " [=10=]} 1' NC_003245

其中:

  • sub(/^>/,"") - 如果行中的第一个字符 (^>) 发生替换,则 sub() 调用被视为 'true' 那么 ...
  • [=17=]=">" FILENAME " " [=17=] - 将行重新定义为 > + FILENAME + <space> + [=21=] (行的其余部分); FILENAME 是一个 awk 内置变量,其中包含正在处理的当前输入文件的名称
  • 注意: - 根据 Ed Morton 的评论更新

这会生成:

>NC_003245 LOC_1_22 # 16427 # 16873 # 1 # ID=1_22;partial=00;start_type=ATG;rbs_motif=GGAG/GAGG;rbs_spacer=5-10bp;gc_cont=0.635
ATGTTCTTTTATTGCCCGAAGACTGGCGGCTTTTACTCTCCAGAGGTACATGGTGAACAAATGCCAGCGG

>NC_003245 LOC_1_23 # 16964 # 18139 # 1 # ID=1_23;partial=00;start_type=ATG;rbs_motif=GGA/GAG/AGG;rbs_spacer=5-10bp;gc_cont=0.651
ATGGCCGCTGACCAATATCATCACGGTGTCCGGGTCCAAGAGATCAATGACGGGACCCGCCCCATTCGCA

要更新源文件,假设使用 GNU awk,添加 -i inplace:

awk -i inplace 'sub(/^>/,"") { [=12=]=">" FILENAME " " [=12=]} 1' NC_003245

如果你在哪里,我会用 R 做这样的事情:

假设您的 fasta 位于一个文件夹中,该文件夹中只有您想使用的 fasta:

library(ape)
setwd("path/to/fasta")

for( i in list.files()){
  a = read.FASTA(i)
  names(a) = paste(strsplit(i,'\.')[[1]][1], names(a))
  write.FASTA(a, file = i)
}

基本上,您使用 for 循环通过使用 i 对象调用文件来加载 fasta(使用 ape 包)。然后你只需替换名称即可。

不过要小心,因为这会覆盖你之前的斋戒。您可以通过更改 write.fasta 参数(使用粘贴)来更改它。

让我知道它是否有效