2017-12-07 8 views
0

확장자가 *bam 인 여러 파일을 병합하는 Java 프로그램을 실행해야합니다. 프로그램의 구조는 다음과 같습니다.파일을 한 줄씩 읽고 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 

그러나 프로그램이 실행 : 처음에, 나는 (filenames.txt)

file1.bam 
file2.bam 
file3.bam 

와 마찬가지로, '동안'명령을 사용하여 *의 빵 파일의 이름 목록을 만들려고 텍스트 파일에 각각 *bam 개의 파일이 있지만 전부는 아닙니다 (시간당 하나의 파일 만 병합하고 출력을 덮어 씁니다). 그래서, 모든 파일을 재귀 적으로 *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 루프는 별도로 각 라인에서 명령을 호출 한 번에 하나 개의 라인을 읽을 것입니다.

+0

도움을 주셔서 감사합니다, @ olli-k! 완벽하게 작동! – Sergio