如何将fasta数组元素与对应分组的fastq数组元素逐一配对迭代?
问题描述
我有两个存储文件名的数组:
files_ref=( $(find . -name '*.fasta') ) files_fq=( $(find . -name '*.fastq') )
我知道如果要按索引配对迭代元素,可以这么写:
for i in "${!files_ref[@]}"; do printf "%s is in %s\n" "${files_ref[i]}" "${files_fq[i]}" done
但实际我的数组结构是这样的:
file_ref=( DI1.fasta DI2.fasta WT1.fasta ) files_fq=( DI1_P1.fastq DI1_P2.fastq DI1_P3.fastq DI2_P1.fastq DI2_P2.fastq DI2_P3.fastq WT1_P1.fastq WT1_P2.fastq WT1_P3.fastq )
我需要将files_ref中的每个元素与files_fq中对应分组的所有元素逐一配对迭代,想要实现如下效果:
DI1.fasta DI1_P1.fastq DI1.fasta DI1_P2.fastq DI1.fasta DI1_P3.fastq DI2.fasta DI2_P1.fastq DI2.fasta DI2_P2.fastq DI2.fasta DI2_P3.fastq WT1.fasta WT1_P1.fastq WT1.fasta WT1_P2.fastq WT1.fasta WT1_P3.fastq
请问有实现方法吗?
实现方案
方法1:基于前缀匹配遍历
核心思路是提取files_ref中每个文件的前缀(比如DI1),然后在files_fq中筛选出以该前缀开头的文件,逐一配对输出:
for ref in "${file_ref[@]}"; do # 提取前缀,去掉.fasta后缀 prefix="${ref%.fasta}" # 遍历fastq数组,匹配前缀 for fq in "${files_fq[@]}"; do if [[ "$fq" == "${prefix}_"*".fastq" ]]; then printf "%s %s\n" "$ref" "$fq" fi done done
方法2:利用固定数量分组迭代
如果每个fasta对应的fastq数量固定(比如都是3个),可以通过索引计算的方式配对:
# 每个ref对应的fq数量 fq_per_ref=3 for i in "${!file_ref[@]}"; do ref="${file_ref[i]}" # 计算当前ref对应的fq起始索引 start_idx=$((i * fq_per_ref)) # 遍历对应范围内的fq元素 for ((j=start_idx; j<start_idx+fq_per_ref; j++)); do printf "%s %s\n" "$ref" "${files_fq[j]}" done done
方法3:先将fastq按前缀分组到关联数组
先把files_fq按前缀归类,再遍历files_ref取出对应组的元素,这种方式更清晰,适合后续扩展:
declare -A fq_groups # 构建fastq分组关联数组 for fq in "${files_fq[@]}"; do # 提取前缀(比如DI1_P1.fastq → DI1) prefix="${fq%%_*}" fq_groups["$prefix"]+="$fq " done # 遍历ref文件,输出配对 for ref in "${file_ref[@]}"; do prefix="${ref%.fasta}" # 拆分分组内的fq文件 read -ra fq_list <<< "${fq_groups[$prefix]}" for fq in "${fq_list[@]}"; do printf "%s %s\n" "$ref" "$fq" done done
内容的提问来源于stack exchange,提问作者Paolo Lorenzini
相关产品推荐
相关产品推荐

