bash의 for 루프는 디렉토리에 새 파일을 입력합니다.

bash의 for 루프는 디렉토리에 새 파일을 입력합니다.

배경 정보: 저는 Prokka(생명정보학의 초보자, Prokka가 없고 Bash 경험이 거의 없음)를 실행하고 있으며 FASTA 파일이 여러 개 있습니다.

FASTA 파일을 하나씩 입력할 수 있는 Bash 루프를 생성해야 한다는 말을 들었습니다.

예: 모든 FASTA(.fna) 파일이 포함된 디렉터리의 이름은 StaphFNA이고 그 안에 1000개의 FASTA 파일이 있습니다. 모두 ID 번호로 이름이 지정되지만 일반처럼 증가하는 대신(1, 2, 3 등으로 번호가 지정되지 않음) 임의 점프가 있습니다. 예를 들어 첫 번째는 34872이고 다음은 8933입니다.

첫 번째 FASTA 파일을 StaphFNA에 입력하고 Prokka에서 처리한 다음 "StaphProkka"라는 파일로 출력해야 합니다. 그런 다음 두 번째 FASTA 파일도 동일한 프로세스를 거쳐 다시 "StaphProkka"로 출력됩니다. 1000개가 모두 완료될 때까지 이 방법을 계속합니다.

상상할 수 있듯이 이 작업을 1000번 수행하는 것은 약간 힘들기 때문에 루프를 수행하고 싶지만 저는 bash를 처음 접하고 어려움을 겪고 있습니다.

나의 Prokka 주장(내 생각에는 이것이 맞다):

prokka /Users/me/Documents/StaphFNA --outdir StaphProkka --prefix staph_aur --kingdom bacteria --locusting staphylococcus

내 For 루프(이것이 잘못되었다는 것을 알고 있습니다):

i = 0
for i in StaphFNA/.fna*; do
    prokka /Users/me/Documents/StaphFNA/$i --outdir StaphProkka --prefix staph_aur --kingdom bacteria --locusting staphylococcus
i = i + 1
done

답변1

출력 파일을 지정할 필요가 없고 prokka가 입력에 따라 다른 이름의 파일을 생성하는 경우 필요한 것은 다음과 같습니다.

for file in /Users/me/Documents/StaphFNA/*.fna; do
    prokka "$file" \ 
        --outdir StaphProkka \
        --prefix staph_aur \
        --kingdom bacteria \
        --locusting staphylococcus 
done

for variable in dir/*패턴은 각 파일이나 디렉터리를 반복 dir/하고 해당 경로 이름을 저장 하므로 $variable카운터 등이 필요하지 않습니다. 예를 들어 처리 file1.fa등 카운터를 사용해야 file2.fa하고 처리도 원하지 않는 경우 otherfile.fa다음과 같이 수행할 수 있습니다(주위에 공백이 없다는 점에 유의하세요. =중요합니다).

for ((i=0; i<=10; i++)); do
    someCommand "file${i}.fa"
done

또는 명시적으로 카운터를 증가시켜야 하는 경우(드문 경우) 다음을 수행할 수 있습니다.

i=0
while [ "$i" -le 10 ]; do
    echo someCommand "file${i}.fa"
    (( i++ ))
done

관련 정보