2017-12-07 28 views
0

*bamという拡張子を持つ複数のファイルをマージするJavaプログラムを実行する必要があります。プログラムの構造は次のとおりです。だから、ファイルを1行ずつ読み込んでJavaプログラムを実行

java -jar mergefiles.jar \ 
I=file1.bam \ 
I=file2.bam \ 
I=file3.bam \ 
O=output.bam 

、私はディレクトリ内のすべての* BAMファイルのためにこのプログラムを実行しようとしています。

while read -r line; do 
java -jar MergeFiles.jar \ 
I=$line \ 
O=output.bam 
done < filenames.txt 

しかし、プログラムを実行:最初は、私は次のように、* BAMファイル(filenames.txt)

file1.bam 
file2.bam 
file3.bam 

と「しばらく」コマンドを使用しての名前のリストを作成しようテキストファイル内のファイルはそれぞれ*bamですが、すべてではありません(時間ごとに1つのファイルのみをマージし、出力を上書きします)。だから、どのようにすべての*bamファイルを再帰的にマージするプログラムを実行することができますか?

また、この問題を解決するためにbashに(ループを使用して)他のオプションがありますか?

ありがとうございます。

+0

'xargs'または' parallel'を使うべきです。 [this quesion](https://stackoverflow.com/questions/3770432/xargs-with-multiple-arguments)を見て、必要な処理を行う必要があります。 –

答えて

1

あなたの質問では、すべての.bamファイルをディレクトリに使用するように指定しているので、ファイル名でファイルを作成する代わりに、代わりにglobbingを使用してください。ここでは例です:

#! /bin/bash 
# set nullglob to be safe 
shopt -s nullglob 
# read the filenames into an array 
files=(*.bam) 
# check that files actually exist 
if ((${#files[@]} == 0)); then echo "no files" && exit 1; fi 
# expand the array with a replacement 
java -jar MergeFiles.jar \ 
"${files[@]/#/I=}" \ 
O=output.bam 

あなたの現在のソリューションに問題がwhileループのみ別途各行のコマンドを呼び出して、一度に1行を読み込むということです。

+0

助けてくれてありがとう、@ olli-k!完璧な仕事! – Sergio

関連する問題