我在一个目录中有几个“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
这假设文件中的浮点数:
- “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