将浮点数转换为十进制数

将浮点数转换为十进制数

我在一个目录中有几个“ascii”表,其中一些具有以十进制表示的数字,另一些具有以浮点数表示的数字,如下所示:

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

有没有办法将表中的所有值转换为十进制数?我听说使用tr编辑器可能有用,但我不知道如何操作转换。

答案1

sed脚本去掉了“e”后面的空格,并且脚本awk只打印出每个字段(将 $3 乘以 1 将其“转换”为非 fp 十进制数):

$ 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. 没有很大的指数,否则awk会将它们打印为 fp。

可以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

相关内容