根据 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[@]##*/}")
我正在尝试创建一个双列数组,例如 filenamesfq
和 filenamestab
是根据字符串的前 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
我正在尝试在 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[@]##*/}")
我正在尝试创建一个双列数组,例如 filenamesfq
和 filenamestab
是根据字符串的前 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