在 bash shell 中循环访问两组文件

在 bash shell 中循环访问两组文件

我在名为 Data 的文件夹中有 25 个相关文件对。这些文件被命名为tcr1_r1.txtand tcr1_r2.txt、  tcr2_r1.txtandtcr2_r2.txt等,直到我达到tcr25…(或我有多少个文件对)。我的问题是我需要将它们配对并在批处理文件中的每对上运行命令。例子:

命令  tcr1_r1.txt tcr2_r2.txt
命令  tcr2_r1.txt tcr2_r2.txt

我怎样才能做到这一点?我正在考虑一个循环,但我似乎无法分离和交替每个命令上的文件。我尝试了一个嵌套循环,但它只是运行每个“r1”文件和所有“r2”文件。

for filename1 in /Data/*_r1.txt
do
  for filename2 in /Data/*_r2.txt
  do
     echo "$filename1 and $filename2"
  done
done

我尝试过使用杰夫·夏勒的回答。以下是我尝试过的确切 shell 文件行:

#!/bin/bash

for first in /mnt/data/Sequencing_core/Data/Raw_data/062419_TCRB_Vanessa_Danielle/20190624_FS10000703_3_BPC29606-1232/Alignment_1/20190625_132145/Fastq/*R1_001.fastq.gz
do

  echo "$first"
  echo "${first/_R1_001.fastq.gz/_R2_001.fastq.gz}" 

done

我肯定错过了什么。我收到“替换错误”错误消息。

答案1

两种方式,取决于你是否要关心文件总数。

在第一种方式中,您知道文件数量为 25(具体命名为 1 到 25):

for index in {1..25}
do
  command tcr"${index}"_r1.txt tcr"${index}"_r2.txt
done

上面,(bash) shell 将 扩展{1..25}为完整的数字集;然后我们将这些数字替换到配对文件名中的适当位置。

第二种方式,你不知道也不关心有多少个文件:

for first in tcr*_r1.txt
do 
  command "$first" "${first/_r1.txt/_r2.txt}"
done

上面,我们循环遍历所有“r1”文件,并用“_r1.txt”部分替换成对的“_r2.txt”。

答案2

你可以只使用xargs:

echo /Data/*_r[12].txt | xargs -n 2 the-command

相关内容