各行に与えられた数学式を評価するインタラクティブな数学計算機である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 デバッガの使用
awk
eval
解釈のために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 で終了する無限ループです。
これらの奇妙な変数名は、そのスクリプトが他のスクリプトの変数を変更するのを防ぐために使用されます。