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

Use awk to remove scientific notation in a column

虽然我确定已经在某处回答了这个问题,但我找不到答案,所以如果这是重复的,我深表歉意。开始了。

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

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

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

但我无法让它处理多列,甚至无法在值之间保持 space(制表符也可以;我不偏爱单个 space).

这是我的文件的几行:

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 行,所以我认为这里几行就足够了)。

你能帮帮我吗?

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

$ 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

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

$ awk -v OFMT='%.5f' '{print +"",+"",+""}' 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

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