处理大数据分析相当新鲜。我主要处理 DNA 和 RNA_seq 数据。
在一个目录中,我有 10,000 个文件(5000 - OG******.paml 和 5000 - OG******.treefile),它们以前缀 OG****** 开头,后跟数字(前- OG0017769)。
ID 是唯一的。
每个 id 有两个文件 -
- OG*****.paml
- OG*****.treefile
使用这两个输入文件,我想运行一个名为 codeml (PAML 包)的程序pamlgithub。
通过在配置文件(excodeml.ctl)中提供所有输入和输出文件。
head -n 4 codeml.ctl
seqfile = OG0017769.paml * sequence data filename
treefile = OG0017769.treefile * tree structure file name
outfile = OG0017769_out.paml * main result file name
使用命令行 -
codeml codeml.ctl
输出文件 -
# These are the output files generated from each default run #
# default output #
2NG.dN
2NG.dS
2NG.t
4fold.nuc
lnf
rst
rst1
rub
OG0017769_out.paml
在批处理模式下
# File 1 input #
OG0017769.paml
OG0017769.treefile
# file 1 expected output #
OG0017769.2NG.dN
OG0017769.2NG.dS
OG0017769.2NG.t
OG0017769.4fold.nuc
OG0017769.lnf
OG0017769.rst
OG0017769.rst1
OG0017769.rub
OG0017769_out.paml
# File 2 input #
OG0017771.paml
OG0017771.treefile
# file 2 expected output #
OG0017771.2NG.dN
OG0017771.2NG.dS
OG0017771.2NG.t
OG0017771.4fold.nuc
OG0017771.lnf
OG0017771.rst
OG0017771.rst1
OG0017771.rub
OG0017771_out.paml
请提供一些建议,如何通过替换 codeml.ctl 配置文件中的 *.paml、*.treefile 和 *out.paml 来自动化该过程。
谢谢,
答案1
定义一个函数或编写一个只接受一个参数的脚本,例如.pamlcodeml
文件或其名称中的独特数字,并通过构造一个包装调用.ctl根据参数文件,不改变模板代码ml.ctl文件:
function mycodeml(){
num="${1//[^0-9]/}" # keep only numbers
if [ !-f OG$num.paml ] ;then
echo ERR NOTFOUND $PWD/OG$num.paml >&2
else
tmp=$(mktemp /tmp/codeml_XXX.ctl)
sed "s/OG[0-9]*\(.paml\|.treefile\|_out.paml\)/OG$num\1/g" codeml.ctl >$tmp &&
codeml $tmp
rm $tmp
fi
}
然后你就可以运行mycodeml OGxxx.paml
要一次对多个条目进行批处理,请使用ls
和收集它们grep
并注入到xargs
:
ls | grep 'OG[0-9]*.paml' | xargs -l1 mycodeml
或并行化:
ls | grep 'OG[0-9]*.paml' | parallel mycodeml