如何在 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 参数(使用粘贴)来更改它。
让我知道它是否有效
亲爱的,我有成千上万的 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 参数(使用粘贴)来更改它。
让我知道它是否有效