如何在一个SGE shell脚本

时间:2018-01-30 16:26:56

标签: linux shell

我正在尝试编写一个用于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个文件?

提前致谢! :)

1 个答案:

答案 0 :(得分:1)

根据您的要求,为每个区域生成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