RNA seq比对Linux学习

如何用脚本来写脚本——Linux批量循环

2020-02-25  本文已影响0人  Steven潘

以前在Linux写循环时都用 ls * | while read id ; do command line $id ; done 的结构,这种方式写起来很简单,但是调试起来有时容易出错,不容易检查。

最近学了一种新的批量循环方式:先用一个比较简单的脚本来写好另一个复杂的脚本,然后再运行后者来执行循环。

1 基础版本

for i in *.bam
do
    echo "command line $i > ${i}_output.txt" >>command.sh
done
#less command.sh
bash command.sh

2 双重循环版

for i in *.bam
do
    for j in *.bed
    do
        echo "command line -a $j -b $a > ${i}_${j}_output.txt" >> command.sh
    done
done
#less command.sh
bash command.sh

3 echo一个带echo命令

for i in {1..3}
do
    echo "echo $i >> output.txt" >> command.sh
done

echo 1 >> output.txt
echo 2 >> output.txt
echo 3 >> output.txt

1
2
3

4 综合版

#变量i对bam文件遍历(外层循环)
for i in /data/aligned/*.sorted.bam
do
    x=${i%%.*} #删除最左侧.号以右的所有字符,即留下/data/aligned/*
    y=${x##*/} #删除最右侧/号以左的所有字符,即留下最简文件名*
    
    echo "echo ====Calculating $y====" > ${y}_command.sh
    #外层的echo会打印出echo ====Calculating $y====
    #其中$y会调用y的值。如果不希望调用,只希望打出“$y”这两个字符,那么就用把双引号改成单引号
    #${y}调用出y的值,并与其后的字符“_command.sh”进行拼接
    #每个i所使用的命令单独保持为一个脚本
    
    #变量j对bed文件遍历(内层循环)
    for j in /data/feature/*.bed 
    do
        echo "bedtools coverage -a $j -b $i >> ${y}_${j}_result.txt" >> ${y}_command.sh
        #这一句是最核心的命令
    done
    echo "echo ====$y finished.====" >> ${y}_command.sh
    #每一个i做完之后都报告一下
done
上一篇 下一篇

猜你喜欢

热点阅读