Bash

循環遍歷數千個文件以進行大數據分析?

  • July 6, 2022

我是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文件副檔名就不會失去。

引用自:https://unix.stackexchange.com/questions/708794