各行の数学的表現を評価する awk または perl

各行の数学的表現を評価する awk または perl

各行に与えられた数学式を評価するインタラクティブな数学計算機であるawkを作成するスクリプトが必要です。

つまり、次の式を評価するために awk コマンドを設定しないでください。

$ awk 'BEGIN{print 180/1149}'
0.156658

$ awk 'BEGIN{print (150+141)/1149}'
0.253264

私のスクリプトでは、数学式を入力として受け取り、インタラクティブに計算したいと思います。したがって、セッションは次のようになります(入力と出力の置き換え)。

180/1149
0.156658
(150+141)/1149
0.253264
1 + 2
3
2 * 3 - 5
1

しかし、私はこれを自分で行うことはできません:

$ awk '{print}'
180/1149
180/1149
^C

$ awk '{print $0}'
180/1149
180/1149
1 + 2
1 + 2
^C

awkを使用する簡単な解決策がない場合、Perlのような他の方法は何ですか?

ベストアンサー1

修理力の評価は、言語awk/言語評価perlの一部として完了します。実行時にランダムな文字列を評価するPerlコードがperlあるので、次のことができます。eval

perl -lne 'print eval $_'

しかし、awkそうではありません(GNUの場合、awkデバッガではそうです。以下を参照)。したがって、awk各行に対して実行を入力し、コード引数にその行の内容を渡す必要があります(たとえば、GNUを使用)xargs

xargs -rd '\n' -I CODE awk -- 'BEGIN{print(CODE)}'

次のようにすることもできます。

sed 's/.*/BEGIN{print(&)}/' | awk -f -

awkすべてのコード行を解釈するコードを実行しますが、awk入力の終わりに達した場合にのみ評価を開始するため、対話型では使用できません。ただし、過去の評価結果を再利用できますperl。良い:

a = 3+4
a*2

7これで印刷されます14


Gawk デバッガの使用

awkeval解釈のためにawkコードを渡すことができるデバッガモードがあるので、次のようにハイジャックできます。

sed -u 's/["\\]/\\&/g;s/.*/eval "print(&)"/' | gawk -D -f /dev/null

おすすめ記事