使用awk删除列中的科学记数法

时间:2016-02-03 22:12:53

标签: awk scientific-notation

虽然我确定这已经在某地得到了解答,但是我无法找到它,所以如果这是重复的话,我很抱歉。我们走了。

我有一个文件(实际上,我有很多文件),它有X,Y和Z数据点,用空格分隔成三列。我正在尝试使用GNUplot对这些进行3D绘图,遗憾的是,它似乎对科学记法不太满意。现在,我可以 sed 以我的方式(A * 10 ** B)表示法而不是(AE + B)表示法,但GNUplot仍然无法识别它。

我知道我可以使用printf“%。5f”从科学记数法转换(我认为五位数就好了),但是我找不到如何格式化我的输入以便我可以将它应用于多列,或者,更好的是,如何控制每列的​​格式。我可以转换一个值:

echo ""|awk '{printf "%.5f", $2}' k11edit.dat

但是我不能让它处理多个列,甚至不能在值之间保持一个空格(一个选项卡也会很好;我不偏向一个空格)。

以下是我文件中的几行:

0.995 8.1584E-004 -0.17051415E+01
0.995 8.8934E-004 -0.17053282E+01
0.995 9.6284E-004 -0.17055150E+01
0.995 1.0363E-003 -0.17057018E+01
0.995 1.1098E-003 -0.17058886E+01
0.995 1.1833E-003 -0.17060754E+01
0.995 1.2568E-003 -0.17062623E+01
0.995 1.3303E-003 -0.17064493E+01
0.995 1.4038E-003 -0.17066362E+01
0.995 1.4773E-003 -0.17068232E+01
0.995 1.5508E-003 -0.17070103E+01
0.995 1.6243E-003 -0.17071973E+01
0.995 1.6978E-003 -0.17073846E+01

是的,我知道第一列在这几行中没有变化,但是它进一步下降(文件长约30,000行,所以我认为这几行就足够了。)

你可以帮帮我吗?

2 个答案:

答案 0 :(得分:4)

没有看到你的预期输出就是猜测,但这就是你想要的:

$ awk '{for (i=1;i<=NF;i++) printf "%.5f%s", $i, (i<NF?OFS:ORS)}' file
0.99500 0.00082 -1.70514
0.99500 0.00089 -1.70533
0.99500 0.00096 -1.70551
0.99500 0.00104 -1.70570
0.99500 0.00111 -1.70589
0.99500 0.00118 -1.70608
0.99500 0.00126 -1.70626
0.99500 0.00133 -1.70645
0.99500 0.00140 -1.70664
0.99500 0.00148 -1.70682
0.99500 0.00155 -1.70701
0.99500 0.00162 -1.70720
0.99500 0.00170 -1.70738

如果您想为每个字段使用不同的格式:

$ awk 'BEGIN{split("%.3f %.7f %.4f",fmt)}
       {for (i=1;i<=NF;i++) printf fmt[i]"%s", $i, (i<NF?OFS:ORS)}' file
0.995 0.0008158 -1.7051
0.995 0.0008893 -1.7053
0.995 0.0009628 -1.7055
0.995 0.0010363 -1.7057
0.995 0.0011098 -1.7059
0.995 0.0011833 -1.7061
0.995 0.0012568 -1.7063
0.995 0.0013303 -1.7064
0.995 0.0014038 -1.7066
0.995 0.0014773 -1.7068
0.995 0.0015508 -1.7070
0.995 0.0016243 -1.7072
0.995 0.0016978 -1.7074

答案 1 :(得分:0)

有一种使用OFMT并强制转换为字符串的hacky方式。

$ awk -v OFMT='%.5f' '{print $1+"",$2+"",$3+""}' file

0.99500 0.00082 -1.70514
0.99500 0.00089 -1.70533
0.99500 0.00096 -1.70551
0.99500 0.00104 -1.70570
0.99500 0.00111 -1.70589
0.99500 0.00118 -1.70608
0.99500 0.00126 -1.70626
0.99500 0.00133 -1.70645
0.99500 0.00140 -1.70664
0.99500 0.00148 -1.70682
0.99500 0.00155 -1.70701
0.99500 0.00162 -1.70720
0.99500 0.00170 -1.70738

但是,如果数字是整数,它就不会转换。