폴더의 여러 파일을 한 번에 처리하기 위해 Mac 터미널에서 명령을 실행하는 방법은 무엇입니까?

폴더의 여러 파일을 한 번에 처리하기 위해 Mac 터미널에서 명령을 실행하는 방법은 무엇입니까?

Mac 터미널의 폴더에 있는 여러 파일에 대해 동일한 명령을 실행하는 방법은 무엇입니까? 이러한 파일의 이름은 24538_7#1_paired1.fq, 24538_7#1_paired2.fq, 24538_7#2_paired1.fq, 24538_7#2_paired2.fq, 등과 유사합니다 24538_7#3_paired1.fq.24538_7#3_paired2.fq

명령은 다음과 같습니다:

STAR --runThreadN 12 --genomeDir indices/STAR --twopassMode Basic --readFilesIn data/24538_7#1_paired1.fq data/24538_7#1_paired2.fq --outFileNamePrefix results/STAR/ 

파일 이름에는 카운터가 포함되므로 당연히 파일 이름을 변경해야 합니다.

명령을 작성하려고 하는데 분할 오류가 발생합니다. 이 명령에 대한 나의 노력은 다음과 같습니다.

for file in 24538_7#*.fq; do STAR --runThreadN 12 --genomeDir indices/STAR --twopassMode Basic --readFilesIn data/"${file%.fq}_paired1.fq" data/"${file%.fq}_paired2.fq" --outFileNamePrefix results/STAR/ ; done

(PS-저는 MacOS를 사용합니다)

답변1

모든 파일을 반복 paired1.fq하고 각 파일에 대해 이름을 사용하여 paired2.fq해당 파일의 이름을 계산합니다. 그런 다음 다음을 사용하여 프로그램을 호출하십시오.

for paired1 in data/*paired1.fq; do
    paired2="${paired1%1.fq}2.fq"  # remove 1.fq from end of name and replace with 2.fq

    if [ ! -f "$paired2" ]; then
        printf 'Missing file:\t%s\n' "$paired2" >&2
        continue
    fi

    prefix="${paired1%_*}" # remove last underscore and everything after
    prefix="${prefix##*/}" # remove directory name from prefix

    # If $paired1 is the string "data/24538_7#1_paired1.fq", then
    # $prefix should now be "24538_7#1"

    mkdir -p "results/STAR/$prefix"

    STAR --runThreadN 12 --genomeDir indices/STAR --twopassMode Basic \
         --readFilesIn "$paired1" "$paired2" \
         --outFileNamePrefix "results/STAR/$prefix/"
done

답변2

매개변수 확장이 충분히 정리되지 않았습니다.

설정 중 file:

file=24538_7#1_paired1.fq

그런 다음 다듬기 .fq:

$ echo ${file%.fq}
24538_7#1_paired1

그런 다음 다음을 추가하십시오 _paired1.fq.

$ echo "${file%.fq}_paired1.fq"
24538_7#1_paired1_paired1.fq

이 시도:

for file in 24538_7#*.fq; do 
    STAR --runThreadN 12 --genomeDir indices/STAR --twopassMode Basic --readFilesIn data/"${file%_paired?.fq}_paired1.fq" data/"${file%_paired?.fq}_paired2.fq" --outFileNamePrefix results/STAR/
done

그러나 각 쌍에는 두 개의 파일이 있으므로 각 쌍은 두 번 실행됩니다. 나는 이것이 당신에게 필요한 것이 아닐 수도 있다고 생각합니다.


각 쌍을 한 번 실행하려면 다음을 수행하면 됩니다.

#!/bin/bash

files=( 24538_7#*.fq )
files=( printf '%s\n' "${files[@]#24538_7#}" | sort -n | awk -F_ '{print $1}' | uniq )

for n in "${files[@]}"; do
    STAR --runThreadN 12 --genomeDir indices/STAR --twopassMode Basic --readFilesIn data/"24538_7#${n}_paired1.fq" data/"24538_7#${n}_paired2.fq" --outFileNamePrefix results/STAR/ 
done

관련 정보