Shell-Script
創建一個腳本來執行一個程序,該程序使用多個具有相同基本名稱的輸入文件,但一個輸入文件除外
我是腳本新手,所以我需要幫助。
我正在執行一個基於四個獨立測試(–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
我建議你從
.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
然後您可以通過萬用字元擴展將其提供給您的腳本。
請注意,我已系統地將變數名稱括在大括號中,建議這樣做以避免可能的語法歧義。我還用雙引號將所有文件名括起來,以避免文件名包含空格字元時出現問題。