この場合、awkでbcをどのように呼び出すのですか?

この場合、awkでbcをどのように呼び出すのですか?

さて、私は私が好きですが、awkはい、精度の問題があり、残念ながらという複数の精度拡張機能をインストールする簡単な方法はありませんgawkextlib

私がやっていることは、次の問題を解決することです。ロザリンド情報シェルシングルライニングを使用してください。私は、Webサイトで設定した5分の制限時間内にDNA / RNA鎖に必要な計算を実行するためにこれらのシェルステートメントを使用することは難しくないことを発見しました。

とにかく私はこの問題に固執しましたが、私はいつもLinuxツールの知識を向上させたいと思います。この場合は、bcから電話する必要がありますawk

コマンドは次bcのようになります。

bc <<< "scale=1000; $1/$2"

私が作業しているテキストの2つの列$1はとです。$2awk

このawkコマンドは、私が書いたいくつかのシェル関数から派生しました。

nucleic-line () {
sed 's/\(.\)/\1\n/g' < $@
}

gc-numeric-count () {
n=$(nucleic-line $@ | wc -l)
m=$(nucleic-line $@ | grep -v "[AT]" | wc -l)
echo $m $n
}
export -f gc-numeric-count

column-percent-count () {
for f in $@; do gc-numeric-count $f; done | awk '{a = $1/$2 | print a * 100}'
}

私の目的に比べてawk '{a = $1/$2 | print a * 100}'正確ではありません。グアニンとシトシンの正確な比率が得られますが、提供できるawkよりも少数の桁数が必要です。私が言ったように、残念ながらインストールすることはできません。gawkextlib任意の精度が必要なのでbcawk

もしそうなら、bcコマンドを使用するには、最後の式の最後の行をどのように変更する必要がありますか?$1$2

ベストアンサー1

問題は、シェルをプログラミング言語ではないものとして扱うことです。シェルは何よりもコマンドラインソルバーです。シェルスクリプトはスクリプトです。問題のロジックとアルゴリズムを実装するためにシェル構文を使用する場合は、間違った方向に進んでいます。

コードに引用されていない変数などの明らかな問題があります。しかし、全体的にAとT以外のファイルで文字の割合を見つけるためにあまりにも多くのコマンドを実行するのは(シェルはプログラミング言語ではなくコマンドを実行するためのツールであるため)醜い感じです。

また、awkは内部的に64ビット浮動小数点数を使用します。これ以上の精度が必要だと確信していますか?この数字がこれより正確なものに使用されている場合、これを使用することはできませんか?すべてのことをしますか?

あなたの質問に答えるには:

$ echo 1 3 | awk -vRS= '{("echo scale=300\\;" $1 "/" $2 "|bc -l") | getline; print}'
.3333333333333333333333333333333333333333333333333333333333333333333\
33333333333333333333333333333333333333333333333333333333333333333333\
33333333333333333333333333333333333333333333333333333333333333333333\
33333333333333333333333333333333333333333333333333333333333333333333\
33333333333333333333333333333

しかし、これがどれほど無意味であるかを簡単に知ることができます。 awk は各入力行に対してシェルと 2 つのコマンドを実行し、出力を読み取り、再印刷します。シェルも、すべての騒ぎなしにかなり良い仕事をすることができます。

それでもawkを使いたい場合は、少し愚かな方法は次のとおりです。

echo 1 3 | awk 'BEGIN{print "scale=300"}{print $1"/"$2}' | bc

その際には一つずつしかawk注文が入らなくなりますbc

私には、実際のプログラミング言語(Perl、Ruby、Pythonが登場)が必要であることは明らかです。シェルスクリプトでプログラミング言語のインタプリタを呼び出すことはできますが、一度だけ呼び出すことができます。 1回の呼び出しで操作全体を完了できます。

おすすめ記事