
ディレクトリには複数の "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
これはファイルの浮動小数点数を仮定します。
- "e"の後に余分なスペースがあります。
- 正の指数の場合は「+」を省略します。
- 非常に大きな指数はありません。それ以外の場合は
awk
fpとして印刷されます。
awk
's/e /e/' 変換が可能ですsed
が(だから必要ありません)、遅すぎて脳が疲れました。 sed | awk
シンプルで効果的です。
答え2
これにより、以下が変換されます。
awk '{print $1, $2, $3 * 10**$4}' file.csv
仮定:
- eと実際の指数の間にはスペースがあります。
- インデックスは各行の最後のフィールドです。
特定の形式が必要な場合は、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