在bash中循环文件

时间:2014-01-02 23:25:23

标签: bash shell parallel-processing

我想循环遍历这些类型的文件,其中具有相同Sample_ID的文件必须一起使用

Sample_51770BL1_R1.fastq.gz
Sample_51770BL1_R2.fastq.gz

Sample_52412_R1.fastq.gz
Sample_52412_R2.fastq.gz

e.g。 Sample_51770BL1_R1.fastq.gz和Sample_51770BL1_R2.fastq.gz在一个命令中一起使用以创建输出。

同样,Sample_52412_R1.fastq.gz和Sample_52412_R2.fastq.gz一起用于创建输出。

我想在bash中编写一个for循环来迭代并创建输出。

sourcedir=/sourcepath/
destdir=/destinationpath/


bwa-0.7.5a/bwa mem -t 4 human_g1k_v37.fasta Sample_52412_R1.fastq.gz  Sample_52412_R2.fastq.gz>$destdir/Sample_52412_R1_R2.sam

我应该如何模式匹配要在一个命令中使用的文件名Sample_ID_R1和Sample_ID_R2?

谢谢,

1 个答案:

答案 0 :(得分:3)

for fname in *_R1.fastq.gz
do
    base=${fname%_R1*}
    bwa-0.7.5a/bwa mem -t 4 human_g1k_v37.fasta "${base}_R1.fastq.gz"  "${base}_R2.fastq.gz" >"$destdir/${base}_R1_R2.sam"
done

在评论中,您要求并行运行多个但不是太多的作业。以下是我的第一次尝试:

#!/bin/bash
# Limit background jobs to no more that $maxproc at once.
maxproc=3

for fname in *  # _R1.fastq.gz
do
    while [ $(jobs | wc -l) -ge "$maxproc" ]
    do
        sleep 1
    done
    base=${fname%_R1*}
    echo starting new job with ongoing=$(jobs | wc -l)
    bwa-0.7.5a/bwa mem -t 4 human_g1k_v37.fasta "${base}_R1.fastq.gz" "${base}_R2.fastq.gz" >"$destdir/${base}_R1_R2.sam" &
done

maxproc的最佳值取决于您的PC拥有多少处理器。您可能需要尝试找出最有效的方法。

请注意,上面的脚本使用的是jobs,这是一个bash内置函数。因此,它必须在bash下运行,而不是破折号,这是Debian类似发行版下脚本的默认值。