因为大部分生物信息学软件都是linux版本的,所以生物信息学数据分析工作者必备技能就是linux,但是大部分人只是拿他当个中转站,我以前也是,直到接触了大批量的任务,自动化流程,才明白这里面的水太深了,不过无所谓,凭我个人的观点,其实shell的进阶语法真的不必要!
当然,只是我一家之言!
我实在是不想去背诵大括号,小括号,中括号以及双重括号到底区别是什么!
http://www.bio-info-trainee.com/?p=1018 [],[[]],(),(()),{},{{}},以及在前面加上$的区别,以及它们互相杂交组合的区别!!!
我也不想去搞明白操作符两边是否加空格的区别是什么了。
if((i%5==0)) 来判断变量是否被一个数整除
i=$((i+1))来表示变量自增。
这些东西真的很诡异!
如果你有qsub,condor等任务提交系统,那么你只需要熟悉他们就可以了,但大部分散兵游勇的生物信息学家并没有集群,所以压根不会接触任务提交系统,就需要些自动化脚本了!
受限制与机器的cpu以及内存数,需要判断提交了多少任务,等待多久再执行,所以会把一个简单的自动化脚本写的很复杂!
比如下面这个脚本:cat >download_hg38_from_UCSC.sh
for i in $(seq 1 22) X Y M;
do echo $i;
done
gunzip *.gz
for i in $(seq 1 22) X Y M;
do cat chr${i}.fa >> hg38.fa;
done
rm -fr chr*.fa
可以下载hg38基因组的fasta文件,但是是分染色体一个个下载的!
再比如下面这个,批量做GSEA分析的脚本:
while read id
do
echo $id
gene=`echo $id |awk '{print $1}'`
probe=`echo $id |awk '{print $2}'`
echo $i
do_GSEA $probe $gene; ##这里是我自己定义的一个function,就不贴出来了
if((i%5==0))
then
sleep 10 ##重点就在这里,每次提交的任务有限制,所以需要休息,不然机器的cpu负载太高!
fi
i=$((i+1))
done <$1
如果,还有其它功能需要实现,我们可以把脚本写的更负载,纯粹的用shell,需要搜索更多的shell技巧。
但是事实上并没有这个必要,我们现在有了更方便的脚本语言,比如我所擅长的perl
我写一个nohup提交任务的脚本!
[perl]
## perl nohup.pl deep_count.sh 0
## perl nohup.pl deep_count.sh 1
## perl nohup.pl deep_count.sh 2
$i=1;
open FH,$ARGV[0];
while(<FH>){
chomp;
next unless $.%3==$ARGV[1];
$cmd="nohup $_ &";
print "$cmd\n";
system($cmd);
sleep(10800) if $i%5==4;
$i++;
#exit;
}
[/perl]
我尝试过用shell,写了很久,总是报错,但是用perl,一分钟我就写完了,所以,最好是用自己熟悉的一种语法最好!