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