私はスクリプトが初めてなので助けが必要です。
入力ファイル名と出力ファイル名が必要な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
その後、ワイルドカード拡張機能を使用してスクリプトに提供できます。
構文のあいまいさを避けるために、変数名を中かっこで体系的に囲みました。また、ファイル名にスペース文字が含まれている場合は、問題を回避するためにすべてのファイル名を二重引用符で囲みます。