awk에서 bash 배열 사용 및 변수 참조: 구문 충돌 문제

awk에서 bash 배열 사용 및 변수 참조: 구문 충돌 문제

목적이 다음과 같은 스크립트가 있습니다.

  • 파일 목록의 경우 각 파일의 특정 번호(구체적으로는 시퀀싱 데이터)를 가져와 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이 주제에 대한 추가 정보.


항상 스크립트를 다음으로 파이프하십시오.주택 검사

관련 정보