Bash
循環遍歷數千個文件以進行大數據分析?
我是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
我哪裡錯了?
如果您查看
codem1
程序的輸出(無論可能是什麼),它表明它沒有找到該文件OG0018055
- 這只是合乎邏輯的,因為該文件實際上被稱為.OG0018055*.fa*
在您的腳本中,您從行中的文件名中刪除
.fa
副檔名gene_name="${filename%%.*}"
獲取基因名稱。然後,您可以使用文件模板中的基因名稱
sed
替換所有出現的模式。GENE
但是,這意味著在您更新codeml_0.ctl
的文件中,該seqfile
行如下所示:seqfile = ../pamlfiles/OG0018055
所以
.fa
這裡缺少副檔名。因此,只需修改您的模板文件以讀取
seqfile = ../pamlfiles/GENE.fa
這樣
.fa
文件副檔名就不會失去。