whileループを入力するためにgrepを使用するBashスクリプトの速度を向上させます。

whileループを入力するためにgrepを使用するBashスクリプトの速度を向上させます。

次のシナリオを使用して、多数の行(> 500 Mb)で構成されているファイルに対してこのスクリプトが機能するようにします。

odd lines: >BLA_BLA lenght_XX cov.XX
even lines: AGCAGCAGACTCAGACTACAGAT  # on even lines there's a DNA sequence

その機能は、「cov」以降の値を再計算することです。引数として渡された引数を使用し、前の引数を置き換え、「G」と「C」がDNA配列に入る偶数行の割合を計算します。

したがって、出力は次のようになります。

> BLA_BLA lenght_XX
> nucleotidic_cov XX
> DNA seq (the same of even lines)
> GC_CONT: XX

コードは次のとおりです(ループのみ)。

K=$(($READLENGHT - $KMER + 1))
Y=$(echo "scale=4; $K / $READLENGHT" | bc)

while read odd; do
    echo -n "${odd##}" | cut -d "_" -f 1,2,3,4 && printf "nucleotide_cov: " 
    echo "scale=4;${odd##*_} / $Y" | bc 
    read even
    echo "${even##}" &&
    ACOUNT=$(echo "${even##}" |  sed -e "s/./&\n /g" | grep -c "A")  
    GCOUNT=$(echo "${even##}" |  sed -e "s/./&\n /g" | grep -c "G")
    CCOUNT=$(echo "${even##}" |  sed -e "s/./&\n /g" | grep -c "C")
    TCOUNT=$(echo "${even##}" |  sed -e "s/./&\n /g" | grep -c "T")
    TOTALBASES=$(($ACOUNT+$GCOUNT+$CCOUNT+$TCOUNT))
    GCCONT=$(($GCOUNT+$CCOUNT))
    printf "GC_CONT: " 
    echo "scale=2;$GCCONT / $TOTALBASES *100" | bc  
done < "$1"

16コアサーバーで大容量テキストファイル(500 Mb以上)を実行すると、非常に遅くなります。このスクリプトの速度を向上させる方法についてのアイデアはありますか?

編集する

要求に応じて必要なI / OはPastebinを介して提供されます。https://pastebin.com/FY0Z7kUW

ベストアンサー1

シェルで合理的に実行できる操作の制限に達しました。 AWK、Perl、Pythonなどの言語でスクリプトを再構築する必要があります。これらの高度な言語を使用すると、すべてのテキスト処理に対して複数のプロセスを実行する必要がなくなり、そのために組み込み機能を使用できます。

おすすめ記事