ファイルの1行に1つの数学方程式を計算する方法は?

ファイルの1行に1つの数学方程式を計算する方法は?

次の内容を含むファイルがあります。

37 * 60 + 55.52
34 * 60 + 51.75
36 * 60 + 2.88
36 * 60 + 14.94
36 * 60 + 18.82
36 * 60 + 8.37
37 * 60 + 48.71
36 * 60 + 34.17
37 * 60 + 42.52
37 * 60 + 51.55
35 * 60 + 34.76
34 * 60 + 18.90
33 * 60 + 49.63
34 * 60 + 37.73
36 * 60 + 4.49

このファイルの各行に対して式を計算し、結果を印刷するシェルコマンドまたはBashスクリプトを作成する必要があります。たとえば、最初の行の場合は、印刷された内容を見たいと思います2275.52。各結果は1行に1回印刷する必要があります。

私はこれを試しましたが、cat math.txt | xargs -n1 exprうまくいきません。これを行うことも可能ですが、awkそのコマンドの構文に慣れていないので、それが何であるかわかりません。

答え1

これはawkトリックを行うようです

while IFS= read i; do 
  awk "BEGIN { print ($i) }"
done < math.txt

~からここ

($i)代わりに(対応する算術式の結果を印刷するのではなく、名前付きファイルに印刷します)など$iの算術式関連の問題を回避するために使用します。1 > 2print 1 > 212print (1 > 2)0

シェル変数の拡張により、$i最終的に次のように解釈されます。パスワードによると、awkこれは本質的にコード挿入の脆弱性。ファイルに有効な算術式のみが含まれていると保証できない場合は、いくつかの入力検証を実行する必要があります。たとえば、ファイルに行があると、system("rm -rf ~")重大な結果が生じる可能性があります。

答え2

これが最善の方法であるかどうかはわかりません

bc < toto 

データで何をしたいかによって異なります。

francois@zaphod:~$ cat > toto
37 * 60 + 55.52
34 * 60 + 51.75
36 * 60 + 2.88
36 * 60 + 14.94
36 * 60 + 18.82
36 * 60 + 8.37
37 * 60 + 48.71
36 * 60 + 34.17
37 * 60 + 42.52
37 * 60 + 51.55
35 * 60 + 34.76
34 * 60 + 18.90
33 * 60 + 49.63
34 * 60 + 37.73
36 * 60 + 4.49
francois@zaphod:~$ while read ; do echo " $REPLY" | bc  ; done < toto
2275.52
2091.75
2162.88
2174.94
2178.82
2168.37
2268.71
2194.17
2262.52
2271.55
2134.76
2058.90
2029.63
2077.73
2164.49
francois@zaphod:~$

BC コマンドがないと、10 進値は使用できません。

francois@zaphod:~$ while read ; do echo $(( "REPLY" )) ; done < toto
-bash: 37 * 60 + 55.52: syntax error: invalid arithmetic operator (error token is ".52")
francois@zaphod:~$

答え3

パールがある場合:

perl -ne 'print eval $_,"\n"' math.txt

(これを使用してラップトップで毎秒50000行を取得します。)

答え4

結果が必要な場合は、下記の回答を入手できます。@フランソワ-p

楽しさとゲームのために、paste以下を追加しますsed

$ paste <(sed 's/\($\)/\1\t=/g' somefile) <(bc < somefile)
37 * 60 + 55.52 =   2275.52
34 * 60 + 51.75 =   2091.75
36 * 60 + 2.88  =   2162.88
36 * 60 + 14.94 =   2174.94
36 * 60 + 18.82 =   2178.82
36 * 60 + 8.37  =   2168.37
37 * 60 + 48.71 =   2268.71
36 * 60 + 34.17 =   2194.17
37 * 60 + 42.52 =   2262.52
37 * 60 + 51.55 =   2271.55
35 * 60 + 34.76 =   2134.76
34 * 60 + 18.90 =   2058.90
33 * 60 + 49.63 =   2029.63
34 * 60 + 37.73 =   2077.73
36 * 60 + 4.49  =   2164.49

関連情報