我是脚本编写新手,所以我需要帮助。
我正在运行一个基于四个单独的测试(--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
然后您可以通过通配符扩展将其提供给您的脚本。
请注意,我系统地将变量名称括在大括号中,建议这样做以避免可能的语法歧义。我还将所有文件名括在双引号中,以避免文件名包含空格字符时出现问题。