목적이 다음과 같은 스크립트가 있습니다.
- 파일 목록의 경우 각 파일의 특정 번호(구체적으로는 시퀀싱 데이터)를 가져와 array1에 저장합니다.
- array1을 사용하여 array1인 가장 작은 숫자를 찾습니다.
- array1의 가장 작은 숫자를 array1의 모든 숫자로 나누어 array2를 얻습니다.
내 스크립트는 다음과 같습니다
#!/usr/bin/bash
USAGE() { echo "Usage: bash $0 [-b <in-bam-files-dir>] [-o <out-dir>] [-c <chromlen>]" 1>&2; exit 1; }
if (($# == 0))
then
USAGE
fi
while getopts ":b:o:c:h" opt
do
case $opt in
b ) BAMFILES=$OPTARG
;;
o ) OUTDIR=$OPTARG
;;
c ) CHROMLEN=$OPTARG
;;
h ) USAGE
;;
\? ) echo "Invalid option: -$OPTARG exiting" >&2
exit
;;
: ) echo "Option -$OPTARG requires an argument" >&2
exit
;;
esac
done
if [ ! -d ${OUTDIR} ]
then
mkdir ${OUTDIR}
fi
if [ ! -d ${OUTDIR}/temp ]
then
mkdir ${OUTDIR}/temp
fi
if [ -d ${BAMFILES} ]
then
echo -e "\nProcessing BAM files from following directory: ${BAMFILES} \n "
fi
module purge
module load samtools
module load bedtools
module load ucsctools
echo -e "Modules are loaded\n"
FIRSTBAM=$(ls $BAMFILES/*bam | head -1)
MIN=$(samtools view -c -F 260 ${FIRSTBAM} )
echo -e "Minimum number of reads is currently set to $MIN from $FIRSTBAM (first bam in directory)\n"
declare -A BAMREADS
echo "BAMREADS array is initialized"
for i in $(ls $BAMFILES/*bam)
do
echo "Counting reads in $i "
BAMREADS[$i]=$(samtools view -c -F 260 $i)
done
for i in ${BAMREADS[@]}
do
if [[ $i -lt $MIN ]]
then
MIN=$i
fi
done
echo -e "Minimum number of reads that will be used for scaling is $MIN \n"
declare -A BAMFRACS
echo -e "BAMFRACS array is initialized"
for i in ${!BAMREADS[@]}
do
BAMFRACS[$i]=$(awk -v var1=${MIN} -v var2=${BAMREADS[$i]} 'BEGIN { x= var1 / var2; printf "%.8f", x }')
done
for i in $(ls $BAMFILES/*bam)
do
SAMPLE=`basename $i`
SAMPLE=${SAMPLE%.bam}
echo $SAMPLE
if [[ ${BAMREADS[$i]} -eq $MIN ]]
then
echo "Sample $i does not need scaling"
command="cp $i ${OUTDIR}/temp/${SAMPLE}.scaled.bam;
genomeCoverageBed -bg -split -ibam ${OUTDIR}/temp/${SAMPLE}.scaled.bam > ${OUTDIR}/temp/${SAMPLE}.bedgraph;
sed -e 's/^/chr/g;s/MT/M/g' ${OUTDIR}/temp/${SAMPLE}.bedgraph > ${OUTDIR}/temp/${SAMPLE}.modified.bedgraph;
sort -k1,1 -k2,2n ${OUTDIR}/temp/${SAMPLE}.modified.bedgraph > ${OUTDIR}/temp/${SAMPLE}.sorted.bedgraph;
bedGraphToBigWig ${OUTDIR}/temp/${SAMPLE}.sorted.bedgraph $CHROMLEN ${OUTDIR}/${SAMPLE}.bw"
#rm ${OUTDIR}/temp/${SAMPLE}.*
else
command="samtools view -s ${BAMFRACS[$i]} -b $i > ${OUTDIR}/temp/${SAMPLE}.scaled.bam;
genomeCoverageBed -bg -split -ibam ${OUTDIR}/temp/${SAMPLE}.scaled.bam > ${OUTDIR}/temp/${SAMPLE}.bedgraph;
sed -e 's/^/chr/g;s/MT/M/g' ${OUTDIR}/temp/${SAMPLE}.bedgraph > ${OUTDIR}/temp/${SAMPLE}.modified.bedgraph;
sort -k1,1 -k2,2n ${OUTDIR}/temp/${SAMPLE}.modified.bedgraph > ${OUTDIR}/temp/${SAMPLE}.sorted.bedgraph;
bedGraphToBigWig ${OUTDIR}/temp/${SAMPLE}.sorted.bedgraph $CHROMLEN ${OUTDIR}/${SAMPLE}.bw"
#rm ${OUTDIR}/temp/${SAMPLE}.*
fi
echo $command | qsub -V -cwd -o $OUTDIR -e $OUTDIR -l tmem=10G -l h_vmem=10G -l h_rt=3600 -N bigwig_${SAMPLE}
done
echo "Task completed: conversion jobs submitted to cluster"
두 가지 질문이 있습니다.
내가 이해한 바로는 bash는 산술 수학, 즉 부동 소수점 숫자(덧셈, 나눗셈 등)와 관련된 작업을 수행하는 데 그다지 능숙하지 않습니다. 그러나 내 스크립트에서 var1과 var2는 항상 정수이므로($MIN 및 모든 array1 값 참조) 이것이 문제가 되지 않는다는 데 동의할 수 있습니까? 즉, 내 작업의 결과는 부동 소수점이지만 정수를 사용하므로 문제가 되지 않습니다. 그렇죠?
StackExchange에서는 구문 강조가 없기 때문에 명확하지 않지만 스크립트의 var2=${BAMREADS[$i]} 부분이 올바르지 않다는 것을 알았습니다. 모든 ${BAMREADS[$i]}를 빨간색으로 표시하는 ${MIN}과 같은 다른 변수와 달리 터미널에서 nano를 사용합니다. 스크립트의 ${BAMREADS[$i] 부분만 빨간색으로 표시됩니다. , 결말 ]}은 빨간색이 아닙니다. 스크립트가 예상대로 실행되고 있는 것 같고 모든 것이 제대로 작동하는 것 같습니다. 그래서 나는 왜 그것이 모두 빨간색이 아닌지 잘 이해하지 못합니다.
이것은 내 스크립트가 nano에서 보이는 모습입니다(awk 명령의 ${BAMREADS[$i]}에 있는 ]}와 나중에 두 번째 $command의 ]}가 빨간색이 아닌 점에 유의하십시오).
하지만 이 코드를https://www.shellcheck.net/, 스크립트의 이 부분을 강조 표시하는 데 문제가 발생하지 않습니다. 그렇다면 nano와 shellcheck가 나에게 같은 것을 말해주지 않는 이유는 무엇입니까? 이 스크립트를 사용해 본 결과 나에게는 효과가 있는 것 같지만 이 강조 표시 문제가 걱정됩니다.
감사해요
답변1
구문 강조가 문제입니다
모든 편집자는 이러한 방식으로 고유한 단점/장점을 가지고 있습니다.
내 질문을 참조하십시오소프트웨어 추천그리고 각각의 대답, 가장 중요한 것은이는 CLI 및 GUI에서 작동합니다.그리고이는 그래픽 사용자 인터페이스에 유용합니다..
특히,비주얼 스튜디오 코드, 가지다IMHOGUI 편집기에서 최고의 구문 강조 기능을 제공합니다.
CLI 편집기에서 이 답변을 참조하세요 gVim
. CLI에 대해 동일한 구문 강조 작업을 수행합니다.
나는 헤비 사용자이기 때문에 따옴표 안의 변수를 구별할 수 있는 방법이 없다고 nano
말할 수 있습니다 .nano
큰따옴표가 누락된 것이 더 큰 문제입니다.
당신을 가장 짜증나게 하는 것은 당신이 사용하지 않고 있다는 것입니다 - 제 생각에는 당신이 익숙하지 않은 것 같습니다 - 나쁜 습관 - 큰 따옴표. 자세한 내용은 StackOverflow를 참조하거나 Google을 참조하세요. 또는 아래를 참조하세요.
큰따옴표는 와일드카드와 단어 분리기를 방지합니다.
쉘 스크립터의 경우 nano
문자열(따옴표) 내부의 변수를 인식하지 못하기 때문에 편집기를 거의 사용할 수 없습니다. 이는 모든 쉘 스크립터에게 매우 나쁜 현상입니다. 쉘 스크립트에서는 큰따옴표가 완전히 필요합니다. 소위 와일드카드와 단어 분리기를 방지합니다.ShellCheck 위키 기사 SC2086이 주제에 대한 추가 정보.