我正在尝试编写用于 Sun Grid Engine 的 shell 脚本。我希望能够将两个任务数组合并到脚本中。一个是文件名列表,另一个是数字(指1到22号染色体)。如果我要在循环中写这个,我会这样做(例如):
readarray -t QTL < QTL_file_list.txt
for i in ${QTL[@]}
do for j in {1..22}
do echo '"$i"_"$j"'
done
done
但是,我希望能够将其作为一个数组来执行。我尝试过的是:
#!/bin/bash -e
#$ -cwd
#$ -pe smp 1-8
#$ -l h_vmem=4G
#$ -N extract_QTL_SNPs
#$ -j y
#$ -t 1-22
# read list of QTL files into an array
readarray -t QTL < QTL_file_list.txt
plink2 --dosage chr${SGE_TASK_ID}.out.dosage.gz --map chr${SGE_TASK_ID}.map --extract ${QTL[$SGE_TASK_ID-1]}SNPlist.txt --write-dosage --out ${QTL[$SGE_TASK_ID-1]}chr${SGE_TASK_ID}_tmp
它成功地合并了 QTL 数组中的每个元素(例如 RegionA、RegionB、RegionC、RegionD、RegionE),但只为每个 QTL 元素输出一个染色体元素,例如
RegionA_chr1_tmp
RegionB_chr2_tmp
RegionC_chr3_tmp
RegionD_chr4_tmp
RegionE_chr5_tmp
有没有办法将两个数组合并到一个脚本中,以便为每个 QTL 元素生成 22 个文件?
提前致谢! :)
根据您的要求,为每个区域生成 22 个文件,运行两个循环,一个用于 QTL 阵列,一个在内部用于迭代最多 22
#!/usr/bin/env bash
readarray -t qtlArray < QTL_file_list.txt
# Assuming qtlArray contains RegionA, RegionB upto E
# Now iterating over the qtlArray, you don't need to loop over
# indices ${arr[idx]} but just do as
for qtlElement in "${qtlArray[@]}"; do
for iterator in {1..22}; do
plink2 --dosage chr"${iterator}".out.dosage.gz \
--map chr"${iterator}".map \
--extract "${qtlElement}"SNPlist.txt \
--write-dosage --out "${qtlElement}"chr"${iterator}"_tmp
done
done
我是一名优秀的程序员,十分优秀!