首页 > 解决方案 > 在继续之前在循环功能中下载两个配对文件

问题描述

我有一个循环,首先使用 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

标签: bashloops

解决方案


当您调用它时,我会将 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##*/}"
}

推荐阅读