저는 스크립팅이 처음이라 도움이 필요합니다.
입력 파일 이름과 출력 파일 이름이 필요한 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
동일한 디렉터리에 동일한 기본 이름을 가진 여러 개의 입력 파일이 있지만 한 파일(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
그런 다음 와일드카드 확장을 통해 이를 스크립트에 제공할 수 있습니다.
구문 모호성을 피하기 위해 변수 이름을 중괄호로 체계적으로 묶었습니다. 또한 파일 이름에 공백 문자가 포함된 경우 문제를 방지하기 위해 모든 파일 이름을 큰따옴표로 묶습니다.