我是 bash 脚本编写的初学者,有人可以帮助我吗?
- 在目录 (
pamlfiles/
) 中,我有文件列表 (*.fa
)OG0018053.fa OG0018054.fa OG0018055.fa
- 这些文件看起来像这样:
head -n 2 ../pamlfiles/* ==> ../pamlfiles/OG0018053.fa <== >C.rhe ATGAGG------------GTCCTCCTGCTTCTCGGATTGGTGGCTTTTGGCCTGGCTGAC ==> ../pamlfiles/OG0018054.fa <== >L.fab atg---------------------acggacgagatatctctggcgtgtggcatgtcagga ==> ../pamlfiles/OG0018055.fa <== >A.ven ATGAACACTGCCACTCCCACCGAGTTTGACTTCTCTTTCTTGGAAGAGGGCTTCTCCGCC
- 我用以下脚本处理它们(
forloop.sh
):#!/bin/bash for file in ../pamlfiles/*.fa do filename=$(basename -- "$file") gene_name="${filename%%.*}" cp codeml_0_opt1_templ.ctl codeml_0.ctl sed -i -e "s/GENE/$gene_name/g" codeml_0.ctl codeml codeml_0.ctl done
但是,当我执行时forloop.sh
,我收到错误
Sequence file ../pamlfiles/OG0018055 not found!
看起来codem1_0_opt1_templ.ctl
像这样:
head codeml_0_opt1_templ.ctl
seqfile = ../pamlfiles/GENE
outfile = results/GENE_M0.txt
treefile = OG0018055.fa.m.fa.mt.py.nex.treefile
noisy = 9
verbose = 0
runmode = 0
seqtype = 1
CodonFreq = 2
我哪里错了?
答案1
如果您查看进程的输出codem1
(无论是什么),它会指出它找不到该文件OG0018055
- 这只是合乎逻辑的,因为该文件实际上被称为.OG0018055.fa
在您的脚本中,您可以.fa
从文件名中的行中删除扩展名
gene_name="${filename%%.*}"
获取基因名称。然后,您可以将文件模板中sed
出现的所有模式替换为该基因名称。GENE
但是,这意味着在更新的codeml_0.ctl
文件中,该seqfile
行如下所示:
seqfile = ../pamlfiles/OG0018055
所以.fa
这里缺少扩展名。
所以,只需修改你的模板文件来读取
seqfile = ../pamlfiles/GENE.fa
这样.fa
文件扩展名就不会丢失。