我有一个目录,其中包括.fasta文件等。每个fasta文件具有以下格式:
OFAS000562-RA-EXON01_rbh.fasta_results.txt.fasta
OFAS000739-RA-EXON03_rbh.fasta_results.txt.fasta
OFAS001341-RA-EXON03_rbh.fasta_results.txt.fasta
OFAS001376-RA-EXON05_rbh.fasta_results.txt.fasta
在每个文件中,例如,OFAS000562-RA-EXON01_rbh.fasta_results.txt.fasta
,是DNA序列及其关联的标头:
>Anasa_tristis_comp16713_c0_seq1
ATATTACGTAGATTGTTCTTTAATTGTCTATGAGTTTCGGAGACAAGGCTCTGAATTTTAGGGTGTTGATCACCGAATGTTAGGATGAGTATTGTTGTGGCGACAATAAATATGAAACCTACAAGGTAACTTTTTGCCCTCATTGAGAAGACACAGCCGCATTTGAGCCTTTTTTCCTTGCACGCTGAGTTTTCCTTAAGA
>Anoplocnemis_curvipes_gi_512414836_gb_GAJV01001484.1
ATATTACGTAGATTGTTCTTTAATTGTCTATGAGTTTCGGAGACAAGGCTCTGAATTCTAGGGTGTTGATCACCGAATGTTAGGATGAGTATTGTTGTAGCGACAATAAATGTGAAACCTACAAGGTAACTTTTTGCCCTCATTGAGAAGACACAGCCGCATTTGAGCCTTTTTCCTTGCACGCTGAGTTTTTCGTAAGA
我想做的是遍历每个.fasta文件,提取文件名的一部分(格式:OFAS##-RA-EXON##),然后将提取的部分插入到每个标题的开头>
符号之后。为了遵循OFAS000562-RA-EXON01_rbh.fasta_results.txt.fasta
示例,我希望文件中的内容如下所示:
>OFAS000562-RA-EXON01_Anasa_tristis_comp16713_c0_seq1
ATATTACGTAGATTGTTCTTTAATTGTCTATGAGTTTCGGAGACAAGGCTCTGAATTTTAGGGTGTTGATCACCGAATGTTAGGATGAGTATTGTTGTGGCGACAATAAATATGAAACCTACAAGGTAACTTTTTGCCCTCATTGAGAAGACACAGCCGCATTTGAGCCTTTTTTCCTTGCACGCTGAGTTTTCCTTAAGA
>OFAS000562-RA-EXON01_Anoplocnemis_curvipes_gi_512414836_gb_GAJV01001484.1
ATATTACGTAGATTGTTCTTTAATTGTCTATGAGTTTCGGAGACAAGGCTCTGAATTCTAGGGTGTTGATCACCGAATGTTAGGATGAGTATTGTTGTAGCGACAATAAATGTGAAACCTACAAGGTAACTTTTTGCCCTCATTGAGAAGACACAGCCGCATTTGAGCCTTTTTCCTTGCACGCTGAGTTTTTCGTAAGA
我在网上看到过一些选项,但这些选项采用整个文件名并插入每行的开头。我对 sed 更熟悉一点,而且我有一个 bash 脚本作为起点,我认为它让我接近我想要的东西。我可能离得很远,或者可能有更简单的方法。我只是不知道如何修改我当前必须提取和/或使用文件名的该部分的内容。
#!/bin/bash
for f in OFAS*
do
sed -i "s/>/>$f_/" "$f"
done
只需从文件名中提取所需的部分,例如:
#!/bin/bash
for f in OFAS*
do
part=$(echo "$f" | sed 's/_rbh.*fasta$//')
sed -i '.old' "s/^>/>${part}_/" "$f"
done
在上面,我只是从每个文件名中删除_rbh.fasta_results.txt.fasta
部分。
#!/bin/bash
for f in OFAS*
do
sed -i "s/>/>${f%%_*}_/" "$f"
done
${f%%*} 将从 f 中删除最长的模式 "*",例如:
f=OFAS000562-RA-EXON01_rbh.fasta_results.txt.fasta
echo ${f%%_*}
给:
OFAS000562-RA-EXON01