Bash
在 bash shell 中循環遍歷兩組文件
我在一個名為 Data 的文件夾中有 25 對相關的文件。這些文件被命名為
tcr1_r1.txt
andtcr1_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
我曾嘗試使用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”。