循环访问数千个文件进行大数据分析?

循环访问数千个文件进行大数据分析?

我是 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文件扩展名就不会丢失。

相关内容