さて、私は私が好きですが、awk
はい、精度の問題があり、残念ながらという複数の精度拡張機能をインストールする簡単な方法はありませんgawkextlib
。
私がやっていることは、次の問題を解決することです。ロザリンド情報シェルシングルライニングを使用してください。私は、Webサイトで設定した5分の制限時間内にDNA / RNA鎖に必要な計算を実行するためにこれらのシェルステートメントを使用することは難しくないことを発見しました。
とにかく私はこの問題に固執しましたが、私はいつもLinuxツールの知識を向上させたいと思います。この場合は、bc
から電話する必要がありますawk
。
コマンドは次bc
のようになります。
bc <<< "scale=1000; $1/$2"
私が作業しているテキストの2つの列$1
はとです。$2
awk
この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
任意の精度が必要なのでbc
。awk
もしそうなら、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回の呼び出しで操作全体を完了できます。
答え2
スクリプトの残りの部分は不明です。 (戻り値に依存しているかどうかわかりません。$m $n他の場所) - これを考えてみましたか?
gc-numeric-count () {
n=$(nucleic-line $@ | wc -l)
m=$(nucleic-line $@ | grep -v "[AT]" | wc -l)
echo "scale=1000;${m}/${n"}
}
export -f gc-numeric-count
column-percent-count () {
for f in $@; do gc-numeric-count $f | bc -l; done
}
答え3
変数の渡しには問題はありません。さらに、GNU dc(bcに含まれる)は、組み込みコンピューティング、より少ないパイプライン、およびバックポリシングにはるかに簡単です。
print '355 113' | awk -vRS='' '{"dc -e \"1000k"$1" "$2"/pq\"" | getline; print; close(dc)}
Stephaneのコメントに同意します。 Shellは手がかり操作を実行し、awkは書式設定操作を実行し、計算はdcで実行する必要があります。