逐行读取文件并运行java程序

时间:2017-12-07 15:24:23

标签: bash loops while-loop

我需要运行一个java程序,它合并多个*bam扩展名的文件。该计划的结构是:

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

所以,我正在尝试为目录中的所有* bam文件运行此程序。最初,我尝试创建一个包含* bam文件名称的列表(filenames.txt)

file1.bam
file2.bam
file3.bam

并使用' while'命令,如:

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

但是,程序对文本文件中的每个*bam文件执行但不是全部一起执行(每次只合并一个文件,并覆盖输出)。那么,我如何运行程序以递归方式合并所有*bam个文件?

另外,bash中还有其他选项(例如使用循环)来解决这个问题吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

在您的问题中,您指定要在dir中使用所有.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循环一次只能读取一行,分别在每行上调用命令。