使用awk删除列中的科学符号

使用awk删除列中的科学符号,awk,scientific-notation,Awk,Scientific Notation,虽然我确信这个问题已经在某处得到了回答,但我找不到答案,所以如果这是重复的话,我很抱歉。我们开始吧 我有一个文件(实际上,我有很多文件),其中的X、Y和Z数据点由空格分隔成三列。我正试图用GNUplot三维绘制这些,遗憾的是,它似乎对科学符号不太满意。现在,我可以sed用(A*10**B)表示法代替(AE+B)表示法,但GNUplot仍然无法识别它 我知道我可以用printf“%.5f”从科学记数法转换过来(我想五位数就可以了),但我找不到如何格式化我的输入,以便我可以将其应用于多个列,或者更好

虽然我确信这个问题已经在某处得到了回答,但我找不到答案,所以如果这是重复的话,我很抱歉。我们开始吧

我有一个文件(实际上,我有很多文件),其中的X、Y和Z数据点由空格分隔成三列。我正试图用GNUplot三维绘制这些,遗憾的是,它似乎对科学符号不太满意。现在,我可以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
是的,我知道第一列在这几行中没有变化,但它会进一步变化(文件大约有30000行长,所以我认为这里有几行就足够了)


你能帮我一下吗?

在没有看到预期输出的情况下,这只是猜测,但这是你想要的吗:

$ 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'{for(i=1;i使用
OFMT
并强制转换为字符串有一种不太好的方法

$ 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

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

编辑您的问题以显示给定该示例输入的预期输出,因为不清楚您试图执行的操作。My gnuplot(版本4.6)对这个符号没有问题:
splot'k11edit.dat'u 1:2:3 w lp
显示您的数据点。我喜欢您使用
?:
来拼写分隔符,足以解释您的代码。因为这是您的答案,而不是我的答案,所以我没有其他注释。第二个表单既没有
开始,也没有
节,也没有loop as:
awk'{printf'%.3f%s%7f%s%.4f%s',$1,OFS,$2,OFS,$3,ORS}“
这正是我要找的。非常感谢。@AdamKatz是的,我对这个特定问题做了比必要的更一般的解释,这样当其他人将来查找它时,他们没有3个固定字段,他们可以看到如何做。如果使用
$1/1
而不是
$1+,它会将值转换为数字”
是的,但需要将数字转换为字符串才能使用OFMT。无论如何,这是一种破解,printf应该是首选方式。整数两种方式都不起作用。你必须执行
a=0.000001;打印$1+a、$2+a、$3+a
来解决这个问题(
a
is
⅒⁽ⁿ⁺¹⁾其中
是所需的精度),这会使0.000004之类的值错误地四舍五入。这对于整数来说不是一个好方法。您可以改为
$1+($1==int$1)?eps:0
$ 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