简单而脆弱的解决方案

简单而脆弱的解决方案

因此,我使用一种名为“tuxedo”的协议进行 RNA 测序数据分析。这更像是与 shell 脚本相关的技术问题。我可以在命令行中执行此操作,并且没有遇到任何问题。由于我是在集群中执行此操作,因此我想使用可以自动执行我的任务的脚本。

因此协议命令如下:

  1. 大礼帽

  2. 袖扣

  3. 袖口合并

  4. 袖口差

    第一个命令完成所有的对齐,并生成一些文件,我必须在下一个命令中使用该文件cufflinks,然后cuffmerge,最后cuffdiff

谁能帮我编写一个简单的 shell 脚本,它可以调用每个命令并执行任务。

任何帮助都将非常感激。

参数

tophat -p 8 -G genes.gtf -o C1_R1_thout genome C1_R1_1.fq C1_R1_2.fq
cufflinks -p 8 -o C1_R1_clout C1_R1_thout/accepted_hits.bam
cuffmerge -g genes.gtf -s genome.fa -p 8 assemblies.txt 
cuffdiff -o diff_out -b genome.fa -p 8 –L C1,C2 -u merged_asm/merged.gtf \
./C1_R1_thout/accepted_hits.bam,./C1_R2_thout/accepted_hits.bam,./C1_R3_thout/accepted_hits.bam \
./C2_R1_thout/accepted_hits.bam,./C2_R3_thout/accepted_hits.bam,./C2_R2_thout/accepted_hits.bam

其中,“p”对应于处理器的数量,“-o”对应于输出目录,其余的“-g”对应于我用来注释将要对齐的 RAW 读取的注释文件。

答案1

简单而脆弱的解决方案

让我们编写一个名为 hailmary.sh 的简单脚本

#!/bin/bash
#The first line should always be just as it is above
#This script is called hailmary.sh
#because we run this script and we need to pray
#that all four commands will run correctly
#If one of them fail, you may not get the results

tophat -p 8 -G genes.gtf -o C1_R1_thout genome C1_R1_1.fq C1_R1_2.fq
cufflinks -p 8 -o C1_R1_clout C1_R1_thout/accepted_hits.bam
cuffmerge -g genes.gtf -s genome.fa -p 8 assemblies.txt 
cuffdiff -o diff_out -b genome.fa -p 8 –L C1,C2 -u merged_asm/merged.gtf ./C1_R1_thout/accepted_hits.bam,./C1_R2_thout/accepted_hits.bam,./C1_R3_thout/accepted_hits.bam ./C2_R1_thout/accepted_hits.bam,./C2_R3_thout/accepted_hits.bam,./C2_R2_thout/accepted_hits.bam
  1. 在 gedit 中复制并粘贴上述所有行(包括以“#”开头的行),然后保存为 hailmary.sh。

  2. 在 Nautilus 中,右键单击刚刚创建的文件并选择 Properties。转到Permissions选项卡并在旁边勾选 允许作为程序执行文件

    或者,在终端输入:

    chmod +x hailmary.sh

  3. 要在终端中运行脚本,请输入:

    ./hailmary.sh

名称前./的 是必需的,并假定文件位于当前目录位置。如果您将文件放在路径中的文件夹中,例如/home/<userid>/bin,则不需要./。如果您将其放在其他地方,则需要写出整个路径,例如:

/home/<userid>/myspecialfolder/hailmary.sh

注意,这四个命令及其参数位于四行中。如果要将它们放在一行中,则必须用&&或分隔它们。如果它们位于不同的行中,则;无需使用。;

在任何一种情况下,第二个命令都不会启动,直到第一个命令完成(或崩溃!)。

这种方法的问题在于,它在运行第二个命令之前不会检查第一个命令是否成功运行,依此类推。因此,如果tophat由于某种原因失败,脚本将继续执行 cufflink、cuffmerge 和 cuffdiff 的顺序。这就是我将此脚本称为的原因hailmary.sh

来源:https://unix.stackexchange.com/questions/184502/bash-how-to-run-a-command-after-the-previous-finished

检查 tophat 输出的脚本

#!/bin/bash
#The first line should always be just as it is above
#This script is called hailmary2.sh
#This script runs tophat
#then checks for the existance of the output file
#If the output is found, it runs the rest

tophat -p 8 -G genes.gtf -o C1_R1_thout genome C1_R1_1.fq C1_R1_2.fq

if [[ -f "./C1_R1_thout/accepted_hits.bam" ]]; then
    echo "tophat finished. Proceeding with the rest"
    cufflinks -p 8 -o C1_R1_clout C1_R1_thout/accepted_hits.bam
    cuffmerge -g genes.gtf -s genome.fa -p 8 assemblies.txt 
    cuffdiff -o diff_out -b genome.fa -p 8 –L C1,C2 -u merged_asm/merged.gtf ./C1_R1_thout/accepted_hits.bam,./C1_R2_thout/accepted_hits.bam,./#C1_R3_thout/accepted_hits.bam ./C2_R1_thout/accepted_hits.bam,./C2_R3_thout/accepted_hits.bam,./C2_R2_thout/accepted_hits.bamfi
else echo "tophat did not complete"
fi

希望这会有所帮助,直到其他人提供更优雅的答案。

相关内容