浮動小数点数を10進数に変換

浮動小数点数を10進数に変換

ディレクトリには複数の "ascii"テーブルがあり、そのうちのいくつかは小数点で表される数字を持ち、いくつかは次のように浮動小数点で表される数字を持っています。

1 1 1423
1 2 1589
1 3 0.85e 5
1 4 0.89e 4
1 5 8796
...

テーブルのすべての値を10進数に変換する方法はありますか?エディタを使うと効果があると聞きましたが、tr変換の仕方がわかりません。

答え1

このsedスクリプトは、「e」の後のスペースを削除し、awk各フィールドのみを印刷します($ 3に1を掛けると、fpではなく10進数に「変換」されます)。

$ sed -e 's/e /e/g' file | awk '{print $1, $2, $3 * 1}'
1 1 1423
1 2 1589
1 3 85000
1 4 8900
1 5 8796

これはファイルの浮動小数点数を仮定します。

  1. "e"の後に余分なスペースがあります。
  2. 正の指数の場合は「+」を省略します。
  3. 非常に大きな指数はありません。それ以外の場合はawkfpとして印刷されます。

awk's/e /e/' 変換が可能ですsedが(だから必要ありません)、遅すぎて脳が疲れました。 sed | awkシンプルで効果的です。

答え2

これにより、以下が変換されます。

awk '{print $1, $2, $3 * 10**$4}' file.csv

仮定:

  1. eと実際の指数の間にはスペースがあります。
  2. インデックスは各行の最後のフィールドです。

特定の形式が必要な場合は、printfフォームを使用できます。

たとえば、

awk '{printf( "%s %s %g "ORS,$1,$2,$3*10**$4)}' file.csv

以下を印刷できます。

1 1 1423 
1 2 1589 
1 3 85000 
1 4 8900 
1 5 8796 
2 8 2.589e+28

大きな指数の最終形式を表示するには、最後の行を追加してください。

答え3

{ sed 's/ /+/3' | xargs printf '%G% G% G\n'; } <in >out

1 1 1423
1 2 1589
1 3 85000
1 4 8900
1 5 8796

%G数値がこの値よりはるかに大きい場合は、精度フラグを使用する必要があります。

答え4

その他の変形awk スプリント機能

awk 'NF==4{$(NF-1)=sprintf(CONVFMT, $(NF-1)$NF);NF=3}1' file

関連情報