我在名为 Data 的文件夹中有 25 个相关文件对。这些文件被命名为tcr1_r1.txt
and tcr1_r2.txt
、 tcr2_r1.txt
andtcr2_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