여러 파일의 파이프라인을 실행하기 위해 for 루프를 사용했지만 불행하게도 터미널이 중간에 멈췄습니다. 파이프라인을 다시 실행하고 싶지만 시간 문제로 인해 출력 파일이 생성된 디렉터리를 건너뛰고 싶습니다. 기본적으로 중첩된 if 문 - 파일 출력 파일이 존재하는 경우 파이프를 실행하지 않으면 무시합니다. 가능합니까?
for f in /Volumes/My\ Passport/Documents/Projects/untitled\ folder\ 2/untitled\ folder\ 3/untitled\ folder\ 2/untitled\ folder/*/*_1.fastq; do
subdir="${f%/*}"
pushd "$subdir" &>/dev/null
file1="${f##*/}"
file2="${file1%_1.fastq}_2.fastq"
adapter="/Volumes/My\ Passport/Documents/adapters.fa"
reference="/Volumes/My\ Passport/Documents/ucsc_hg19/ucsc.hg19.fasta"
dbSNP="/Volumes/My\ Passport/Documents/ucsc_hg19/dbsnp_138.hg19"
COSMIC="/Volumes/My\ Passport/Documents/ucsc_hg19/CosmicCodingMuts.vcf"
interval="/Volumes/My\ Passport/Documents/plist.bed"
sjdb="/Volumes/My\ Passport/Documents/ucsc_hg19/ucsc.hg19.gtf"
file3="${file1%_1.fastq}_1_trimmed.fastq"
file4="${file2%_2.fastq}_2_trimmed.fastq"
#preQC (cutadapt -O subtracted, prinseq -min_qual_score 4 -ns_max_p 2 subtracted)
~/Desktop/UTSW/Applications/bbmap/bbduk.sh -Xmx120g in1="${file1}" in2="${file2}" out1="${file1%_1.fastq}_1_trimmed.fastq" out2="${file2%_2.fastq}_2_trimmed.fastq" ref="${adapter}" trimq=10
paste - - - - < "${file3}" | sort -k1,1 -t " " | tr "\t" "\n" > "${file3%_1_trimmed.fastq}_trimmed_sorted_1.fastq"
paste - - - - < "${file4}" | sort -k1,1 -t " " | tr "\t" "\n" > "${file4%_2_trimmed.fastq}_trimmed_sorted_2.fastq"
parallel -j $PARALLEL_TASKS perl ~/UTSW/Applications/prinseq-lite-0.20.4/prinseq-lite.pl -fastq "${file3%_1_trimmed.fastq}_trimmed_sorted_1.fastq" -fastq2 "${file4%_2_trimmed.fastq}_trimmed_sorted_2.fastq" -no_qual_header -trim_right 1 -custom_params "A 75%;T 75%;G 75%;C 75%" min_qual_mean 25 -min_len 40 -out_format 3 -out_good "${f%.*}_QC" -out_bad null -log
done
답변1
어디에서 테스트를 권장해야 할지 잘 모르겠지만 [
쉘 명령과 [[
bash 내장 기능 모두 다음과 같이 사용할 수 있는 테스트가 있습니다.
for f in ...
do
if [[ ! -e "$f" ]]
then
# do work here because file $f does not exist
fi
done
이것은 단지 예일 뿐이며 루프 본문이 무엇을 하는지 잘 모르겠습니다. 따라서 테스트는 루프 본문의 다른 곳으로 가야 할 수도 있습니다.
답변2
일반적으로 파일을 열 수 있는지(입력 또는 출력용으로) 테스트하는 가장 좋은 방법은 파일을 열어보는 것입니다.
더 구체적으로 말하자면, 출력의 경우 출력용 파일을 열려는 경우 이렇게 하면새로운POSIX 쉘에서 제공하는 파일손상 없음셸 옵션은 구성 가능하므로 set
이를 사용하여 계속하기 전에 출력이 있는지 테스트할 수 있습니다.
현재 스크립트를 이해하는 것은 약간 어렵지만 다음을 고려해 보십시오.
set -C -- '/Volumes/My Passport/Documents/Projects/untitled folder 2/untitled folder 3/untitled folder 2/untitled folder/'*/*_1.fastq
[ -e "$1" ] &&
for f
do if cd -- "${f%/*}" &&
f=${f##*/} f=${f%1*}
then if command exec \
3> "$f"1_trimmed.fastq \
4> "$f"2_trimmed.fastq \
5> "$f"_trimmed_sorted_1.fastq \
6> "$f"_trimmed_sorted_2.fastq
then ~/Desktop/UTSW/Applications/bbmap/bbduk.sh -Xmx120g in1="$f"1.fastq in2="$f"2.fastq out1=/dev/fd/3 out2=/dev/fd/4 ref="${adapter}" trimq=10 &&
paste - - - - < "$f"1_trimmed.fastq | sort ... | tr >&5 ... &&
paste - - - - < "$f"2_trimmed.fastq | sort ... | tr >&6 ...
fi
fi
done