根据 bash 中的文件名前缀匹配创建配对数组

Creating paired array based on file name prefix match in bash

我正在尝试在 bash 中创建一个 for 循环/while 循环,它使用两个不同的文件(具有相同的前缀)。例如:

/home/samples - 包含文件 A-anything.fq B-anything.fq 等

/home/annotation - 包含文件 A-anything2.tab B-anything2.tab 等

我在两个单独的数组中称呼他们的名字:

filepathsfq=( /home/samples/*fq )

filenamesfq=( "${filepathsfq[@]##*/}" ) #create an array so no
meta-characters in file name mess with anything

filepathstab=( /home/anottation/*tab )

filenamestab=("${filepathstab[@]##*/}")

我正在尝试创建一个双列数组,例如 filenamesfqfilenamestab 是根据字符串的前 10 个字符的 MATCH 配对的(这足以用于完整文件配对我的情况,因为前 10 个字符是文件标识符)。

例如:

A12345689-anything.fq A12345689-anything2.tab
 
B12345689-anything.fq B12345689-anything2.tab

我试过

declare -a a0=("${filepathsfq[@]##*/}")

declare -a a1=("${filepathstab[@]##*/}")

这确实有效,但我不能在一个 for 循环中将数组作为一个变量调用

我想要这个“配对数组”,因为我正在尝试 运行 一个 for 循环,它需要的只能接受一个变量。所以这个变量必须包含所有成对的名字。

我什至不知道如何根据前 10 个字符开始配对名称。我一直在通过将值导出到 CSV 文件然后使用公式来匹配 excel 中的前 10 个字符来做到这一点,这不是很好。

我还用过:

paste -d, <(printf '%s\n' "${filepathsfq[@]##*/}") <(printf '%s\n' "${filepathstab[@]##*/}") >> samples.csv

要创建 CSV 文件,请手动验证所有内容是否已正确配对,然后:

while IFS="," read fq tab
do
    echo $fq, $tab
done < samples.csv

以上代码可用于预期目的,但需要对名称匹配进行外部验证。我不知道如何匹配文件名并将其转换为数组并在 for 循环或 while 循环中使用它

给定两个目录:

/home/samples
|-- A12345689-anything.fq
|-- B12345689-anything.fq
|-- C12345689-anything0.fq
|-- C12345689-anything1.fq
`-- D12345689-anything.fq

/home/annotation
|-- A12345689-anything2.tab
|-- B12345689-anything2.tab
|-- C12345689-anything2.tab
`-- E12345689-anything2.tab

以下bash代码:

#!/bin/bash

shopt -s nullglob

fq_dirpath=/home/samples
tab_dirpath=/home/annotation

for fq_filepath in "$fq_dirpath"/*.fq
do
    prefix=${fq_filepath##*/}
    prefix=${prefix:0:10}

    fq_filepaths=( "$fq_dirpath"/"$prefix"*.fq )
    tab_filepaths=( "$tab_dirpath"/"$prefix"*.tab )

    # sanity checks
    [ ${#fq_filepaths[@]} -eq 1 ] || continue
    [ ${#tab_filepaths[@]} -eq 1 ] || continue

    fq_filename=${fq_filepaths##*/}
    tab_filename=${tab_filepaths##*/}

    # process the pair
    printf '%s %s\n' "$fq_filename" "$tab_filename"
done

shopt -u nullglob

输出:

A12345689-anything.fq A12345689-anything2.tab
B12345689-anything.fq B12345689-anything2.tab