私は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
ファイル拡張子が失われることはありません。