创建一个脚本来运行一个程序,该程序使用多个具有相同基本名称的输入文件(一个输入文件除外)

创建一个脚本来运行一个程序,该程序使用多个具有相同基本名称的输入文件(一个输入文件除外)

我是脚本编写新手,所以我需要帮助。

我正在运行一个基于四个单独的测试(--max-maf)的程序,该测试需要输入文件名和输出文件名。以下只是该程序的一般描述。文件名是我在下一个块代码中详细描述的输入。

epacts group --groupf filename.grp --vcf filename.vcf.gz --ped filename.ped --max-maf 0.05 --kin filename --test emmaxCMC --out BcA/filename-CMC-0.05
epacts group --groupf filename.grp --vcf filename.vcf.gz --ped filename.ped --max-maf 0.03 --kin filename --test emmaxCMC --out BcA/filename-CMC-0.03
epacts group --groupf filename.grp --vcf filename.vcf.gz --ped filename.ped --max-maf 0.02 --kin filename --test emmaxCMC --out BcA/filename-CMC-0.02
epacts group --groupf filename.grp --vcf filename.vcf.gz --ped filename.ped --max-maf 0.01 --kin filename --test emmaxCMC --out BcA/filename-CMC-0.01

我在同一目录中有多个具有相同基本名称的输入文件,但一个文件 (CDES_MyopV1.ped) 具有相同的基本名称,但其后面有一个唯一标识符。该文件将位于 --ped 命令之后 (--ped CDES_MyopV1.ped)

CDES-genes.grp 
CDES.vcf.gz 
CDES_MyopV1.ped 
CDES.kinf

我尝试创建一个脚本,通过根据基本名称“CDES”查找上面列出的输入文件来执行程序,但是,我意识到我需要 .ped 文件包含基本名称及其后面的唯一标识符(CDES_MyopV1)另外,对于每个输出文件,我希望将 CDES_MyopV1 连接到输出文件名。

这是我迄今为止尝试过的:

declare -a files=("CDES")

for element in ${files[@]}
do
   epacts group --groupf $element-genes.grp --vcf $element.vcf.gz --ped $element.ped --max-maf 0.05 --kin $element.kinf  --test emmaxCMC --out BcA/$element-CMC-0.05
   epacts group --groupf $element-genes.grp --vcf $element.vcf.gz --ped $element.ped --max-maf 0.03 --kin $element.kinf  --test emmaxCMC --out BcA/$element-CMC-0.01 
   epacts group --groupf $element-genes.grp --vcf $element.vcf.gz --ped $element.ped --max-maf 0.02 --kin $element.kinf --test emmaxCMC --out BcA/$element-CMC-0.05 
   epacts group --groupf $element-genes.grp --vcf $element.vcf.gz --ped $element.ped --max-maf 0.01 --kin $element.kinf --test emmaxCMC --out BcA/$element-CMC-0.01
done

理想情况下,这就是我希望脚本执行的操作。

epacts group --groupf CDES-genes.grp --vcf CDES.vcf.gz --ped CDES_MyopV1.ped --max-maf 0.05 --kin CDES.kinf  --test emmaxCMC --out BcA/CDES_MyopV1-CMC-0.05
       epacts group --groupf CDES-genes.grp --vcf CDES.vcf.gz --ped CDES_MyopV1.ped --max-maf 0.03 --kin CDES.kinf  --test emmaxCMC --out BcA/CDES_MyopV1-CMC-0.03 
       epacts group --groupf CDES-genes.grp --vcf CDES.vcf.gz --ped CDES_MyopV1.ped --max-maf 0.02 --kin CDES.kinf --test emmaxCMC --out BcA/CDES_MyopV1-CMC-0.02 
       epacts group --groupf CDES-genes.grp --vcf CDES.vcf.gz --ped CDES_MyopV1.ped --max-maf 0.01 --kin CDES.kinf --test emmaxCMC --out BcA/CDES_MyopV1-CMC-0.01

答案1

我建议您从文件的全名开始.ped,然后通过 shell 参数扩展机制提取所需的部分,如下所示:

#!/bin/bash

declare -a files=("CDES_MyopV1.ped")
declare -a mafs=("0.05" "0.03" "0.02" "0.01")

for file in ${files[@]}
do
   uniquename=$(basename "${file}")
   element="${uniquename%%_*}"
   for maf in ${mafs[@]}
   do
      epacts group --groupf "${element}-genes.grp" --vcf "${element}.vcf.gz" --ped "${file}" --max-maf "$maf" --kin "${element}.kinf" --test emmaxCMC --out "BcA/${uniquename}-CMC-${maf}"
   done
done

该变量uniquename将是基本名称“CDES”和唯一后缀“_MyopV1”的组合,而变量element将单独是基本名称。

如果您这样做,您可以轻松地将硬编码数组替换为目录中的files实际文件列表,如下所示:.ped

for file in *.ped
do
   ...
done

或者将文件列表作为参数传递给脚本,如下所示:

for file in "${@}"
do
   ...
done

然后您可以通过通配符扩展将其提供给您的脚本。

请注意,我系统地将变量名称括在大括号中,建议这样做以避免可能的语法歧义。我还将所有文件名括在双引号中,以避免文件名包含空格字符时出现问题。

相关内容