我需要运行一个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中还有其他选项(例如使用循环)来解决这个问题吗?
提前致谢。
答案 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
循环一次只能读取一行,分别在每行上调用命令。