原计划本次内容是按自己思路修改的msia脚本写一个shell脚本,但是看我推文的大部分都是搜索过来的,看到这篇推文大部分还是打算学这个流程的。所以,本次流程的脚本还是在原misa脚本基础上书写。以我改的msia脚本为基础的shell脚本放在最后一部分,不做介绍。
另外,我不建议用我前面的教程去做科研任务,学习下脚本应该就可以了。
另外,我不建议用我前面的教程去做科研任务,学习下脚本应该就可以了。
另外,我不建议用我前面的教程去做科研任务,学习下脚本应该就可以了。
本教程不直接提供脚本,不过你看看参考部分,可能会有惊喜!
本教程shell脚本分为几个部分
用到的知识点;基础msia流程;可接续的shell脚本;以我改的misa脚本教程为基础的shell脚本;致谢;参考
知识点介绍
知识点一:
sh -c "字符串"
:在脚本里重新调用一个shell,来解析被当成字符串的命令。
知识点二:
if 语句中
-a 表示逻辑 "与";-o 表示逻辑 "或"; ! 表示逻辑 "非"; 三种逻辑顺序级别由高到底:! > -a > -o
-f 表示文件存在;-d 表示文件夹存在;
知识点三:
子函数书写形式之一:
function misa_check(){
command
}
#其内输入参数可用$1,$2…等表示
知识点四:
流程的可接续写法:
-
参考了我之前的推文“Trinotate 半自动快速安装与部署”提到的
Build_Trinotate_Boilerplate_SQLite_db.pl
脚本。不过这里是创建了一个文件夹作为标志文件,如果标志性文件夹存在,则不运行;如果标志性文件夹不存在,则运行该程序。 -
由于需要批量运行,这里的每个输入数据都会创建不同的标志性文件夹存放路径,除非你不同的数据非要用同一个文件名。
运行结束后删除标志性文件,此时再次运行不会接续,而是重新开始运行。
if [ -d "$1" ]
then
echo "$1 exist!" && sleep 1s && break
else
sh -c "$2" && mkdir -p __tmp_${FASTA}/$1
echo -e "DONE: $2 !"
fi
基础MISA流程
primer3设置文件见参考文章部分
FASTA=test.fasta
perl misa.pl ${FASTA}
perl p3_in.pl ${FASTA}.misa
#引物设计时间会很久
./primer3-2.3.5/src/primer3_core -default_version=1 -p3_settings_file=my_default_settings.txt.txt -output=${FASTA}.p3out ${FASTA}.p3in
perl p3_out.pl ${FASTA}.p3in ${FASTA}.misa
可接续的shell脚本
-
脚本需要修改“全局设置”的3个地方:
变量FASTA:输入数据(可输入文件改为
$1
,用顺序传参的方式可以批量运行该脚本了 )变量PRIMER3_CORE: 可执行程序
primer3_core
位置primer3的配置文件 : my_default_settings.txt
-
脚本分为三个部分
变量设置部分;
对象检查部分;
程序运行部分
-
如果你修改下面脚本部分时无法运行,可以尝试注释掉
set -euo pipefail
行。
#!usr/bin/env sh
set -euo pipefail
##Description: My pipline for misa v1.0 and primer3 2.3.5 of linux platform
##用法:以下文件需要放到该shell脚本同文件夹下
## 需要将fasta文件, primer3的配置文件 放到与shell脚本同文件夹下;
## misa.pl, p3_in.pl, p3_out.pl等脚本 放到与shell脚本同文件夹下;
## 然后修改全局变量位置即可。
###-------------------------------------------
###全局设置
###-------------------------------------------
FASTA=./test/test.fa #文件位置
PRIMER3_CORE=./primer3-2.3.5/src/primer3_core #primer3_core位置
PRIMER3_SETTING=./my_default_settings.txt
#记得修改 my_default_settings.txt
###-------------------------------------------
###输入输出对象检查
###-------------------------------------------
# check the scripts, input file and output path
## check the scripts
### -a 表示逻辑 "与";-o 表示逻辑 "或"; ! 表示逻辑 "非"; 三种逻辑顺序级别由高到底:! > -a > -o
### -f 表示文件存在;-d 表示文件夹存在;
if [ -f "misa.pl" -a -f "p3_in.pl" -a -f "p3_out.pl" ] #-e表示文件存在,-a 表示逻辑 "与"
then
echo -e "the misa scripts is ready!\n" && sleep 1s
else
echo -e "the misa scripts not found!\n"
exit 1
fi
## check the fasta file!
if [ -f $FASTA ]
then
echo -e "input file: $FASTA is ready!\n" && sleep 1s
sleep 1s
else
echo "input file: $FASTA not found!"
exit 1
fi
function misa_check(){
if [ -d "$1" ]
then
echo "$1 exist!" && sleep 1s && break
else
sh -c "$2" && mkdir -p __tmp_${FASTA}/$1
echo -e "DONE: $2 !"
fi
}
misa_check misa.pl.ok "perl misa.pl ${FASTA} > /dev/null 2>&1"
misa_check p3_in.pl.ok "perl p3_in.pl ${FASTA}.misa"
misa_check primer3.ok "./primer3-2.3.5/src/primer3_core -default_version=1 -p3_settings_file=${PRIMER3_SETTING} -output=${FASTA}.p3out ${FASTA}.p3in"
misa_check p3_out.pl.ok "perl p3_out.pl ${FASTA}.p3out ${FASTA}.misa"
rm -rf __tmp_${FASTA}
echo "DONE:SSRs searching and primers designing of ${FASTA}!"
以我改的misa脚本教程为基础的shell脚本(该流程初学者不建议看,容易晕)
#!usr/bin/env sh
set -euo pipefail
###-------------------------------------------
###全局设置
###-------------------------------------------
## 记得修改 my_default_settings.txt
##path of programme
MISA_PATH=./misa
PRIMER3_CORE=primer3_core
PRIMER3_SETTING=my_default_settings.txt
##input file
FASTA=./fasta/test.fa
##output path
RESULT_PATH=./results/
## every result
filename=$(basename $FASTA)
EVERY_RESULT=$RESULT_PATH/$filename
mkdir -p $RESULT_PATH/$filename
###-------------------------------------------
###输入输出对象检查
###-------------------------------------------
# check the scripts, input file and output path
## check the scripts
if [ -f "$MISA_PATH/misa.pl" -a -f "$MISA_PATH/p3_in.pl" -a -f "$MISA_PATH/p3_out.pl" -a ] #-e表示文件存在,-a 表示逻辑 "与"
then
echo -e "the misa scripts is ready!\n" && sleep 1s
sleep 1s
else
echo -e "the misa scripts not found!\n"
exit 1
fi
## check the fasta file!
if [ -f $FASTA ]
then
echo -e "input file: $FASTA is ready!\n" && sleep 1s
sleep 1s
else
echo "input file: $FASTA not found!"
exit 1
fi
if [ -f ${PRIMER3_SETTING} ]
then
echo -e "input file: ${PRIMER3_SETTING} is ready!\n" && sleep 1s
sleep 1s
else
echo "input file: ${PRIMER3_SETTING} not found!"
exit 1
fi
## check the output path
if [ -d $EVERY_RESULT ]
then
echo -e "output path: $EVERY_RESULT is ready!\n" && sleep 1s
else
echo "output path: $EVERY_RESULT not found!"
exit 1
fi
###-------------------------------------------
###运行程序
###-------------------------------------------
# SSRs searching and primers designing
function misa_check(){
if [ -d "$1" ]
then
echo "$1 exist!" && sleep 1s && break
else
sh -c "$2" && mkdir -p __tmp_${FASTA}/$1
echo -e "DONE: $2 !"
fi
}
misa_check misa.pl.ok "perl ${MISA_PATH}/misa.pl ${MISA_PATH}/misa.ini $FASTA ${EVERY_RESULT} > /dev/null 2>&1 " #输出到黑洞
misa_check p3_in.pl.ok "perl ${MISA_PATH}/p3_in.pl ${EVERY_RESULT}/${filename}.misa ${FASTA} ${EVERY_RESULT} > primer3_parameters_${filename}.txt"
misa_check primer3.ok "$PRIMER3_CORE -default_version=1 -p3_settings_file=${PRIMER3_SETTING} -output=${EVERY_RESULT}/${filename}.p3out ${EVERY_RESULT}/${filename}.p3in"
misa_check p3_out.pl.ok "perl ${MISA_PATH}/p3_out.pl ${EVERY_RESULT}/${filename}.p3out ${EVERY_RESULT}/${filename}.misa ${EVERY_RESULT}"
rm -rf __temp_${filename}
echo "SSRs searching and primers designing of $filename have been completed!"
致谢
感谢生信技能树的司徒老师的答疑;感谢福建农林的史同学让我发现了新的问题。
参考
-
primer3设计引物详解 http://www.chenlianfu.com/?p=284
-
使用Misa结合Primer3来批量设计SSR引物 http://www.chenlianfu.com/?p=255
-
SSR (misa + primer3 ) 设计SSR引物 https://blog.csdn.net/wt141643/article/details/113878893
-
《Bioinformatics Data Skills》之编写与运行鲁棒的bash脚本 https://www.jianshu.com/p/6bf09e8da73f
网友评论