次の内容を含むファイルがあります。
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 > 2
print 1 > 2
1
2
print (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