bash - 在继续之前在循环功能中下载两个配对文件
问题描述
我有一个循环,首先使用 url 链接下载文件,然后使用samtools
. 对于其中的每个文件,input.txt
都有一个 *.cram 和一个 *.crai 文件,它们除了结尾之外具有相同的名称。这两个文件都需要下载才能samtools
运行。mapfile
我想知道如何在继续执行该步骤之前使用同时下载 *.cram 和一个 *.crai samtools
。
测试.txt
gs://hmf-cram-1231313-drup01010104/file1_dedup.realigned.cram
gs://hmf-cram-1231313-drup01010104/file1_dedup.realigned.crai
gs://hmf-cram-1234235353-drup01242424/file1_dedup.realigned.cram
gs://hmf-cram-1234235353-drup01242424/file1_dedup.realigned.crai
脚本
#!/bin/bash
mapfile -s 1 -t files < test.txt
echo "${files[@]}"
for FILE in ${files[@]}; do
gsutil -u absolute-bison-xxxx cp $FILE gs://bucket_1
samtools view -@5 -O bam -f 4 ${FILE##*/}.cram > /home/user/${FILE##*/}.unmapped.bam
rm *.cram
rm *.crai;
done
解决方案
当您调用它时,我会将 test.txt 传递给脚本:
./script < test.txt
然后一次处理一条记录。在这种情况下,它似乎是两行:
while read cram && read crai
do
process "$cram" "$crai"
done
我没有使用过 mapfile、gsutil 和 samtools,顺便说一句,所以我不知道这两个文件是谁起作用的。但是,我会验证这两个文件是匹配对的假设并避免使用通配符 rm:
process() {
local cram=$1
local crai=$2
if [ "$cram" != "${crai%crai}cram" ]
then
echo "Pair does not match: cram=$cram, crai=$crai" 1>&2
return
fi
...
rm -- "${cram##*/}" "${crai##*/}"
}
推荐阅读
- excel - excel中的VBA代码与非常简单的代码运行不一致
- forms - 使用 Flutter 将表单上传到 Firestore
- bootstrap-4 - 折叠时无法使居中徽标重新定位到右侧
- function - 由于 NanoMatch 问题,Firestore 的 Firebase 功能失败
- asp.net-mvc - 出现错误“此命令只能在通过 CLI 运行时在 CLI 项目错误中运行”
- c++ - 如何在我自己的 Arduino 库中使用外部库?
- c# - 处理较长的下载时间
- c - gcc 命令中的 .o 文件是什么?
- vba - 32809 应用程序定义或对象定义错误
- jaxb - JAXB 解组无法返回具有替代组的元素