Shell-Script

創建一個腳本來執行一個程序,該程序使用多個具有相同基本名稱的輸入文件,但一個輸入文件除外

  • July 7, 2022

我是腳本新手,所以我需要幫助。

我正在執行一個基於四個獨立測試(–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

然後您可以通過萬用字元擴展將其提供給您的腳本。

請注意,我已系統地將變數名稱括在大括號中,建議這樣做以避免可能的語法歧義。我還用雙引號將所有文件名括起來,以避免文件名包含空格字元時出現問題。

引用自:https://unix.stackexchange.com/questions/708922