Bash

在 bash shell 中循環遍歷兩組文件

  • June 29, 2019

我在一個名為 Data 的文件夾中有 25 對相關的文件。這些文件被命名為tcr1_r1.txtand tcr1_r2.txt,  tcr2_r1.txtand tcr2_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

我曾嘗試使用Jeff Schaller 的回答。這是我嘗試過的確切的 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

我肯定錯過了什麼。我收到“錯誤替換”錯誤消息。

兩種方式,取決於你是否要關心文件總數。

在第一種方式中,您知道文件數為 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”。

引用自:https://unix.stackexchange.com/questions/527493