2017-02-09 25 views
0

私はforループを書き直そうとしています(それはうまくいきます)、並列で実行していますが、何か問題があります。ここに私のループfor-loopを "parallel"で使用するように書き直し

function no_sam { 
    filename=$(basename "$file") 
    extension="${file##*.}" 

    if [ $extension = "sam" ]; 
     then 
     filename="${filename%.*}" 
     feat_out=$filename.out 
     htseq-count -f $types -r "$pos" -m "$mode" -i "$attribute" -s "$strand" -t "$feature" -a "$qual" "$file" "$input_gff" > "$feat_out" 
     grep -v "_" "$feat_out" > temp && mv temp "$feat_out" 
     mv "$feat_out" "$counts_folder" 
    elif [ $extension = "bam" ]; 
     then 
     filename="${filename%.*}" 
     feat_out=$filename.out 
     htseq-count -f $types -r "$pos" -m "$mode" -i "$attribute" -s "$strand" -t "$feature" -a "$qual" "$file" "$input_gff" > "$feat_out" 
     grep -v "_" "$feat_out" > temp && mv temp "$feat_out" 
     mv "$feat_out" "$counts_folder" 
    fi  
} 

for file in "${multi[@]}"; do 
    no_sam 
done 

ため、私はGNU平行なループのために交換したときに、私は取得していますエラーです

"${multi[@]}" no_sam | parallel 

testfile.sam: command not found 
+0

あなたのスクリプトをshellcheck.netと 'bash -x'で実行してください。 – codeforester

+0

私はすでにしました。それは私がどのように "並列"ソフトウェアを実行しているかにかかわる問題です。 – upendra

+0

shellcheckが報告した懸念事項を修正しましたか? – codeforester

答えて

0

試してみてください。この(https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Using-shell-variableshttps://www.gnu.org/software/parallel/man.html#EXAMPLE:-Calling-Bash-functionsに基づく):

function no_sam { 
    file="$1" 
    filename=$(basename "$file") 
    extension="${file##*.}" 

    if [ $extension = "sam" ]; 
     then 
     filename="${filename%.*}" 
     feat_out=$filename.out 
     htseq-count -f $types -r "$pos" -m "$mode" -i "$attribute" -s "$strand" -t "$feature" -a "$qual" "$file" "$input_gff" > "$feat_out" 
     grep -v "_" "$feat_out" > temp && mv temp "$feat_out" 
     mv "$feat_out" "$counts_folder" 
    elif [ $extension = "bam" ]; 
     then 
     filename="${filename%.*}" 
     feat_out=$filename.out 
     htseq-count -f $types -r "$pos" -m "$mode" -i "$attribute" -s "$strand" -t "$feature" -a "$qual" "$file" "$input_gff" > "$feat_out" 
     grep -v "_" "$feat_out" > temp && mv temp "$feat_out" 
     mv "$feat_out" "$counts_folder" 
    fi  
} 
export -f no_sam 

parallel no_sam ::: "${multi[@]}" 

あなたがGNU並列を使う方法から、man parallel_tutorialを歩いて1時間を過ごすことで恩恵を受けると思います。 あなたのコマンドラインがあなたを愛してくれます。

関連する問題