2015-10-21 37 views
0

我在destdir中有n個文件夾。每個文件夾包含兩個文件:* R1.fastq和* R2.fastq。使用這個腳本,它將逐個完成作業(bowtie2)並在destdir中輸出{子文件夾的名稱} .sam。將GNU並行與嵌套for循環和多個變量結合起來

#!/bin/bash 

mm9_index="/Users/bowtie2-2.2.6/indexes/mm9/mm9" 
destdir=/Users/Desktop/test/outdir/ 

for f in $destdir/* 
do 
fbase=$(basename "$f") 
echo "Sample $fbase" 
bowtie2 -p 4 -x $mm9_index -X 2000 \ 
-1 "$f"/*R1.fastq \ 
-2 "$f"/*R2.fastq \ 
-S $destdir/${fbase}.sam 
done 

我想用GNU工具平行於加快這,你能幫忙嗎?謝謝。

+0

高度simil ar到biostars「問題:生成shell腳本」https://www.biostars.org/p/162555/#162558 – Pierre

回答

2

使用bash函數:

#!/bin/bash 

my_bowtie() { 
    mm9_index="/Users/bowtie2-2.2.6/indexes/mm9/mm9" 
    destdir=/Users/Desktop/test/outdir/ 
    f="$1" 
    fbase=$(basename "$f") 
    echo "Sample $fbase" 
    bowtie2 -p 4 -x $mm9_index -X 2000 \ 
    -1 "$f"/*R1.fastq \ 
    -2 "$f"/*R2.fastq \ 
    -S $destdir/${fbase}.sam 
} 
export -f my_bowtie 
parallel my_bowtie ::: $destdir/* 

有關詳細信息:man parallelhttp://www.gnu.org/software/parallel/man.html#EXAMPLE:-Calling-Bash-functions

+0

它很棒!感謝大家 :) –

0

簡單地說,你可以通常只是把echo你的命令的前部和發送命令的列表,你會按順序執行,以GNU Parallel,並行執行,就像這樣:

for f in ...; do 
    echo bowtie2 -p 4 .... 
done | parallel 
+0

謝謝。不知道我是否做得對,但它仍然一次處理每個子文件夾。 –

+0

你有多個CPU /內核?嘗試在「並行」之後的末尾添加「-j 8」,一次運行8。 –

+0

產生正確輸出的作業是否仍然存在? –