各行の数学的表現を評価する 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

答え2

インタラクティブに使用します。


非対話型の方法で式評価をスクリプトとして作成する場合:

$ cat file
180/1149
(150+141)/1149
1 + 2
2 * 3 - 5

$ bc < file
.15665796344647519582
.25326370757180156657
3
1

入力と出力をインターリーブするには、次のものを使用できます。

$ paste -d '\n' file <(bc < file)
180/1149
.15665796344647519582
(150+141)/1149
.25326370757180156657
1 + 2
3
2 * 3 - 5
1

答え3

パールで実行してみてください!


...またはawkを使用することもできます。次の(2次)awkスクリプトを考えてみましょう。run-in-awk

#!/usr/bin/awk -f
{ system( "awk 'BEGIN{print " $0 "}' ") }

chmod +x run-in-awk実際にawkにawkを実行するように依頼した後

$ run-in-awk example
0.156658
0.156658
0.253264
0.253264
3
3
1
1

標準入力キーボード入力でも機能します。

答え4

awkでshを使うことができますが、なぜawkやPerlだけを使うのですか?

#!/bin/sh
while read e_x__p_ress_ion___; do
    awk "BEGIN{print ${e_x__p_ress_ion___}}"
done

その後、式を読み取り、それを変数に保存します。次に awk print を呼び出し、変数を渡します。これは control-c で終了する無限ループです。

これらの奇妙な変数名は、そのスクリプトが他のスクリプトの変数を変更するのを防ぐために使用されます。

関連情報