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"

2つの質問があります。

  • 私が理解したのは、bashは算術数学、つまり浮動小数点数(加算、除算など)に関連する操作を実行するのにあまりうまくいかないことです。しかし、私のスクリプトでは、var1とvar2は常に整数なので($ MINとすべてのarray1値を参照)、これは問題にならないことに同意できますか?つまり、私の操作の結果は浮動小数点ですが、整数を使用するので問題になりません。そうですか?

  • StackExchangeでは構文強調がないため明確ではありませんが、スクリプトのvar2 = $ {BAMREADS [$ i]}部分が正しくないことがわかりました。すべての ${BAMREADS[$i]} を赤で表示する ${MIN} などの他の変数とは異なり、端末で nano を使用します。スクリプトの ${BAMREADS[$i] 部分だけが赤色で表示されます。 、エンディング]}は赤ではありません。スクリプトが期待どおりに実行されているようで、すべてが正常に動作しているようです。だから私はなぜそれが赤でないのかよく理解していません。

これは私のスクリプトがnanoで見える様子です(awkコマンドの$ {BAMREADS [$ i]}の]}と後で2番目の$ commandの]}が赤ではないことに注意してください)。

ここに画像の説明を入力してください。

しかし、このコードhttps://www.shellcheck.net/、スクリプトのこの部分を強調表示するのに問題はありません。それでは、nanoとshellcheckが私に同じことを伝えないのはなぜですか?このスクリプトを使用した結果、私には効果があるようですが、この強調表示の問題が心配です。

ありがとう

ベストアンサー1

構文の強調が問題です

すべての編集者はこのように独自の欠点/利点を持っています。

私の質問を見てくださいソフトウェア推奨そしてそれぞれの答え、最も重要なことこれはCLIとGUIで機能します。そしてこれはグラフィカルユーザーインターフェイスに役立ちます。

特に、ビジュアルスタジオコードを持つIMHOGUIエディタで最高の構文強調機能を提供します。

CLIエディタでこの回答を参照してくださいgVim。 CLIに対して同じ構文強調操作を実行します。

私はヘビーユーザーなので、引用符内の変数を区別する方法がないとnano言えます。nano


二重引用符が欠落していることがより大きな問題です。

あなたを最も迷惑にするのは、あなたが使用していないということです - 私の考えには慣れていないようです - 悪い習慣 - 二重引用符。詳細については、StackOverflowを参照するか、Googleをご覧ください。または以下を参照してください。


二重引用符はワイルドカードとワードセパレータを防ぎます。

シェルスクリプトでは、nano文字列(引用符)内の変数を認識しないため、エディタはほとんど使用できません。これはすべてのシェルスクリプターにとって非常に悪い現象です。シェルスクリプトでは二重引用符が完全に必要です。いわゆるワイルドカードとワードセパレータを防ぎます。ShellCheck Wiki 記事 SC2086このトピックに関する追加情報。


常にスクリプトを次にパイプします。住宅検査

おすすめ記事