迭代一个数组中的项目和第二个数组中的项目组

问题描述 投票:0回答:1

我有两个包含文件名的数组

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 及其同一组中的所有相应项目:

DI1.fasta with DI1_P1.fastq DI1_P2.fastq DI1_P3.fastq
DI2.fasta with DI2_P1.fastq DI2_P2.fastq DI2_P3.fastq
WT1.fasta with WT1_P1.fastq WT1_P2.fastq WT1_P3.fastq

有什么建议吗?

...更清楚一点

我需要这样的迭代:

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
arrays linux bash loops shell
1个回答
0
投票

解决此问题的一种方法是首先提取前缀(DI1、DI2、WT1),然后进行两次迭代。例如,这个 Bash 脚本将产生您想要的输出:

prefixes=()
for name in "${file_ref[@]}"; do
    prefixes+=("${name%.*}")
done

for prefix in "${prefixes[@]}"; do

    echo -n "$prefix.fasta with "

    for fq in "${files_fq[@]}"; do
        if [[ $fq == $prefix* ]]; then
            echo -n "$fq "
        fi
    done
    echo # add a newline
done
© www.soinside.com 2019 - 2024. All rights reserved.