UNIXシェルスクリプトの浮動小数点演算



Floating Point Arithmetic Unix Shell Script



解決:

私はあなたが使うべきだと信じています:紀元前

例えば:



エコー 'スケール= 10; 123.456789 / 345.345345 '|紀元前

(これはUNIXの方法です。各ツールは本来の機能をうまく実行することに特化しており、すべてが連携して優れた機能を実行します。優れたツールを他のツールとエミュレートするのではなく、連携させてください。)

出力:



.3574879198

またはのスケールで代わりに110:

エコー 'スケール= 1; 123.456789 / 345.345345 '|紀元前

出力:

.3

これは丸めを実行しないことに注意してください。



より複雑な操作を行う必要がある場合はawkに、最も複雑な操作を行う場合はperlに切り替えることを強くお勧めします。

例:awkで実行される操作:

#テストファイルを作成します:printf '1.5493482,3.49384,33.284732,23.043852,2.2384,12.1,13.4、...  n'> somefile printf '3.384,3.282342,23.043852,2.23284,8.39283,14.1,15.2、...  n '>> somefile#OPの計算を実行します(そしてDEBUGはそれらを出力します!)awk -F'、 ''#ここに一重引用符を入れません...コメントでも!代わりに、次のように出力できます。 047#-Fはawkに '、'を区切り文字として使用するように指示します。したがって、awkはそれを使用して自動的に行を分割します。 #$ 1 =最初の前 '、' $ 2 = 1番目と2番目の間 '、' ...などfunctionsome_awk_function_here_if_you_want(){#オプションの関数定義#ここにいくつかのアクション。関数などへの引数を持つこともできます。print'DEBUG:some_awk_function_here_if_you_wantでまだアクションが定義されていません... '} BEGIN {rem ='オプションのSTARTセクション。ここでは、最初のファイルの最初の行が読み取られる前に初期化を行うことができます '}(NF> = 8){rem ='少なくとも8つの値がコンマで区切られている各行(およびその条件を満たす行のみ) 'calc1 =($ 2- $ 7)calc2 =($ 3 * $ 2)calc3 =($ 2- $ 1)calc4 =($ 2 + $ 8)#この関数を呼び出すためのコメント解除:(ex1):#some_awk_function_here_if_you_want#このスクリプトを呼び出すためのコメント解除:( ex2):#cmd = '/ path / to / some / script.sh ' 'calc1'  '' 'calc2'  '...'; rem = '次の行に続く'#このスクリプトを呼び出すためのコメントを外す:(ex2):#system(cmd); close(cmd)line_no =(FNR-1)#?なぜ-1? 。 FNR = CURRENTファイルの行番号。 NR =最初からの行番号(最初のファイルの後のNR> FNR ...)print'DEBUG:calc1 = 'calc1'、calc2 = 'calc2'、calc3 = 'calc3'、calc4 = 'calc4'、line_no = ' line_no print'DEBUG fancier_exemples:フォーマットに関する多くの情報についてはman printfを参照してください(浮動小数点数の場合は%... f、整数の場合は%... d、文字列の場合は%... sなど) 'printf(' DEBUG:calc1 = %d、calc2 =%10.2f、calc3 =%s、calc4 =%d、line_no =%d  n '、calc1、calc2、calc3、calc4、line_no)} END {rem ='オプションのENDセクション。ここに、最後のファイルの最後の行が読み取られた後に発生する必要があることを置くことができます '}' somefile#awkスクリプトの終わり、およびそれによって読み取られるファイルのリスト。 

これはどうですか?

calc = $(echo '$ String2 + $ String8' | bc)

これは$ String2と$ String8の値を追加し、結果を変数に保存するbc計算


'bc'がない場合は、 'awk'を使用できます。

calc = $(echo 2.3 4.6 | awk '{printf'%f '、$ 1 + $ 2}')