有看到文章里分析几个叶绿体基因组SSR位点的,但是MISA+Primer3
直接批量跑的话,所有脚本、输入和输出文件全放在一个文件夹里(由misa脚本所制约),过于杂乱。想让其分开的话就不得不修改下脚本。本文提供下修改misa
脚本思路(最好还是先熟悉下misa脚本)。
没系统学习过perl,用词可能不准,大家领会精神即可。
下面开始胡说八道。
- 需要修改的脚本
misa.pl
,p3_in.pl
, p3out.pl
- 需要的知识点
- 知识点一:
$ARGV[0]
,$ARGV[1]
等是perl脚本中顺序传参的变量,类似shell脚本中的$1
,$2
… , 只不过perl中式从0开始,作为传递参数的第一个变量。@ARGV
在知识点二中表示数组@ARGV的物理大小。 - 知识点二:misa.pl脚本中
if (@ARGV == 0)
{
open (IN,"<$0");
while (<IN>) {if (/^\#\# (.*)/) {$message .= "$1\n"}};
close (IN);
die $message;
};
这部分代码意思就是:执行脚本,当参数数量为0时,将该脚本中以 两个#
开头的行作为错误信息(或者说时帮助信息)输出到标准输出。
- 知识点三:模块File::Basename
用其中的basename()
函数 获取文件名,便于输出文件命名。
- 思路:针对三个知识点分别作出修改
-
关于知识点一:
-
misa.pl
的misa.in
配置文件指向路径写活;输出结果文件前加传参变量,加入一个用于结果路径的传参变量,将结果文件路径写活。最终该脚本需要传入三个参数。
运行示例:
perl ./misa/misa.pl ./misa/misa.ini ./fasta/seqs.fasta ./results/
一般我们是将misa和misa.ini脚本放在一个文件夹下的,但是我不会在perl中写这一部分(获取当前将本路径),就只能单独作为变量了。
-
p3_in.pl
中实际需要的文件是seqs.fasta.misa
文件和seqs.fasta
文件,所以,在seqs.fasta
位置处加入一个传参变量;输出结果文件前加入一个用于结果路径的传参变量。最终该脚本需要传入三个参数。
运行示例:
perl ./msia/p3_in.pl ./results/seqs.fasta.misa ./fasta/seqs.fasta ./results/
-
p3_out.pl
中修改类似p3_in.pl
运行示例:
perl p3_out.pl ./results/seqs.fasta.p3out ./results/seqs.fasta.misa ./results/
另一种改法:如果是将所有结果放到一个文件中,其实可以将上面的参数精简为2个,一个是结果路径
./results/
,一个是序列名称seqs.fasta
,但是个人感觉这样有点乱,不能从参数中直观获取所需要的输入文件,也就没这么改。 -
-
关于知识点二:
p3_in.pl
和p3_out.pl
中并不自带帮助信息。通过知识点一的修改,路径就有些乱了,所以利用知识点二给两个脚本添加帮助信息。- 将需要作为帮助信息的内容以
##
作为一行的开头,后面添加帮助信息内容即可。 - 经过知识点一中的修改,
misa.pl
p3_in.pl
和p3_out.pl
都带有了三个参数,所以可以将知识点二中的命令稍作修改。如果传入参数不是3个,打印帮助信息。
- 将需要作为帮助信息的内容以
if (@ARGV != 3)
{
open (IN,"<$0");
while (<IN>) {if (/^\#\# (.*)/) {$message .= "$1\n"}};
close (IN);
die $message;
};
脚本内,我们只限定了3个参数数量,并没有检查文件或者文件夹是否存在。这部分检查可以放到shell批量脚本中进行。
- 关于知识点三:主要是将带有路径的文件参数,去掉路径,获取文件名。
以p3_in.pl
为例,修改后其第一个参数$ARGV[0]
为 ./results/seqs.fasta.misa
原脚本中:
open (IN,"<$ARGV[0]") || die ("\nError: Couldn't open misa.pl results file (*.misa) !\n\n");
my $filename = $ARGV[0];
$filename =~ s/\.misa//;
将上面内容修改为:
open (IN,"<$ARGV[0]") || die ("\nError: Couldn't open misa.pl results file (*.misa) !\n\n");
use File::Basename;
my $filename = $ARGV[0]; #此时$filename=./results/seqs.fasta.misa
$filename=basename("$ARGV[0]") #此时$filename=seqs.fasta.misa
$filename =~ s/\.misa//; #此时$filename=seqs.fasta
此时便获取了$filename
便于命名结果文件。
为了使代码更简洁,可以合并第3,4行,修改为:
open (IN,"<$ARGV[0]") || die ("\nError: Couldn't open misa.pl results file (*.misa) !\n\n");
use File::Basename;
my $filename = basename("$ARGV[0]"); #此时$filename=seqs.fasta.misa
$filename =~ s/\.misa//;
然后模仿着再修改misa.pl
和p3_out.pl
。
如果你不想按知识点三内容修改,可以按照知识点一修改,不过要传入更多的变量用于输出文件,但这无疑会增加shell脚本的出错率。
- 小结
顺序传参、增加的传参变量都增加了shell脚本出错率,如果不是自己修改,可能还是觉得有些乱的。梳理脚本后可以写好批量运行的shell脚本,减少修改参数,使其不那么凌乱。但不管怎么说,修改后的文件,批量运行后可以将
输入文件、脚本和结果文件分开了。后期还可以加入长选项用于指定参数。
下一篇内容将更新搭配这次修改的shell脚本,只需要修改如下几个参数就可以完成一次任务。脚本还可以支持断点接续。批量模式只需要将$FASTA
作为shell脚本的$1
即可批量运行。
##path of programe
MISA_PATH=./misa
PRIMER3_CORE=primer3_core
##input file
FASTA=./fasta/test.fa
##output path
RESULT_PATH=./results
网友评论