기본 이름이 동일한 여러 입력 파일(하나 제외)을 사용하는 프로그램을 실행하는 스크립트를 만듭니다.

기본 이름이 동일한 여러 입력 파일(하나 제외)을 사용하는 프로그램을 실행하는 스크립트를 만듭니다.

저는 스크립팅이 처음이라 도움이 필요합니다.

입력 파일 이름과 출력 파일 이름이 필요한 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

그런 다음 와일드카드 확장을 통해 이를 스크립트에 제공할 수 있습니다.

구문 모호성을 피하기 위해 변수 이름을 중괄호로 체계적으로 묶었습니다. 또한 파일 이름에 공백 문자가 포함된 경우 문제를 방지하기 위해 모든 파일 이름을 큰따옴표로 묶습니다.

관련 정보