【问题标题】:Bash script stops after 1 fileBash 脚本在 1 个文件后停止
【发布时间】:2020-10-05 23:47:41
【问题描述】:

我正在尝试对目录中的所有 .bam 文件运行生物信息学命令行工具。这就是我正在使用的:

#!/bin/sh

reference='/path/Homo_sapiens_assembly19.fasta'

for f in *.bam
do 
    base_name=${f%.bam}
    java -jar /ppath/GenomeAnalysisTK.jar -R $reference \
   -T ASEReadCounter \
   -o $base_name.csv \
   -I $f \
   -sites $base_name.vcf \
   -U ALLOW_N_CIGAR_READS \
   -minDepth 10 \
   --minMappingQuality 10 \
   --minBaseQuality 2
done;

问题是循环在遍历第一个 bam 文件后停止。我最终会喜欢这个来检查一组 2000 个 .bam 文件,我不想手动输入它们(这将花费超过 30 小时)。

【问题讨论】:

  • 你怎么知道它在第一个文件之后停止?
  • 我只得到 1 个输出文件,在终端中,我只看到对第一个 .bam 文件的调用,即。用 base_name 和 $f 代替 sample1。 @John1024:不,脚本没有。那是格式错误。我知道该脚本的工作原理是它为我提供了我想要的目录中的 1 bam。
  • “调用第一个 .bam 文件”是什么意思?
  • 对不起,我不清楚。该目录包含名为 sampleN.bam/sampleN.vcf 的文件,用于 N = 1,2.... 我看到它为 sample1.bam、sample1.vcf 执行所需的命令,但对任何后续 (bam,vcf) 对都没有.
  • 顺便说一句。 bash != sh

标签: bash bioinformatics bam


【解决方案1】:

尝试以下方法:

#!/bin/bash

reference='/path/Homo_sapiens_assembly19.fasta'

for f in $(ls ./*.bam); do
    base_name=${f%.bam} 
    #base_name=$(basename ${f})  # alternatively you can use this
    java -jar /ppath/GenomeAnalysisTK.jar -R ${reference} \
   -T ASEReadCounter \
   -o ${base_name}.csv \
   -I ${f} \
   -sites ${base_name}.vcf \
   -U ALLOW_N_CIGAR_READS \
   -minDepth 10 \
   --minMappingQuality 10 \
   --minBaseQuality 2
done;

我怀疑您的 -o $base_name.csv 正在寻找一个名为 basename.csv 而不是 basename 的变量,因此会覆盖输出文件,使其看起来好像只处理了一个 bam 文件。这应该很容易解决,方法是使用${basename} 调用您的 bash 变量,然后使用后缀扩展它们。

【讨论】:

  • 原始脚本最终运行。问题是我在目录中的第二个 bam 文件实际上是一个 txt 文件。我用两个真正的 bam 文件再次运行它,它成功了。
猜你喜欢
  • 1970-01-01
  • 2018-03-17
  • 2020-09-30
  • 2017-12-29
  • 2018-02-04
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 2018-05-10
相关资源
最近更新 更多