同じ基本名を持つ複数の入力ファイル(1つを除く)を使用するプログラムを実行するスクリプトを作成します。

同じ基本名を持つ複数の入力ファイル(1つを除く)を使用するプログラムを実行するスクリプトを作成します。

私はスクリプトが初めてなので助けが必要です。

入力ファイル名と出力ファイル名が必要な4つの個別テスト(--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

同じディレクトリに同じベース名を持つ複数の入力ファイルがありますが、1つのファイル(CDES_MyopV1.ped)はデフォルト名は同じですが、その後に一意の識別子があります。このファイルは--pedコマンド(--ped CDES_MyopV1.ped)の後にあります。

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

基本名「CDES」に基づいて、上記の入力ファイルを見つけてプログラムを実行するスクリプトを作成しようとしましたが、基本名と一意の識別子(CDES_MyopV1)を含む.pedファイルが必要であることに気づきました。 )また、各出力ファイルに対して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次のシェルパラメータ拡張メカニズムを使用して必要な部分を抽出することをお勧めします。

#!/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

その後、ワイルドカード拡張機能を使用してスクリプトに提供できます。

構文のあいまいさを避けるために、変数名を中かっこで体系的に囲みました。また、ファイル名にスペース文字が含まれている場合は、問題を回避するためにすべてのファイル名を二重引用符で囲みます。

関連情報