如何格式化数字和小数字符串?

时间:2014-08-21 16:49:27

标签: unix awk string-formatting

我的text.csv文件如下所示。我想使用awk命令截断浮点数。

ZAR Spot Up 8%,10011569,1.1234873687000001
ZAR Spot Up 8%,10011584,0.8789456464999999
ZAR Spot Up 8%,10011587,0.4543572142000001

我这样做:

awk '{ FS = "," ; printf(sprintf("%s,%d,%.10f\n",$1,$2,$3))}' text.csv

然而,"%s"正在以奇怪的方式格式化第一列

ZAR,0,0.0000000000
ZAR Spot Up 8%,10011584,0.8789456465
8ZAR Spot Up 8%,10011587,0.4543572142

我喜欢的地方

ZAR Spot Up 8%,10011569,1.1234873687
ZAR Spot Up 8%,10011584,0.8789456465
ZAR Spot Up 8%,10011587,0.4543572142

我认为这与“&#;;' 8'或者'%'标志。知道正确的命令是什么吗?

2 个答案:

答案 0 :(得分:1)

您需要在脚本中更早地设置FS;第一行输入已经在您分配时被读取和解析。

此外,双printf显然是多余的。

awk -F, '{ printf("%s,%d,%.10f\n",$1,$2,$3)}' text.csv

答案 1 :(得分:1)

您正在使用printf format, data格式参数位置中的数据,并且该数据包含格式字符(%)。只是不要那样做,按照概要使用printf format, data

特别是在您的情况下(注意printf正在获得一个参数):

printf sprintf("%s,%d,%.10f\n",$1,$2,$3)

所以包含sprintf字符的%的输出是printf的第一个arg,这就是格式arg所在的位置。如果您将其更改为:

printf "%s", sprintf("%s,%d,%.10f\n",$1,$2,$3)

然后你就不会有问题,但当然sprintf是多余的,因为你可以写:

printf "%s,%d,%.10f\n",$1,$2,$3

并且在这种情况下,因为你真的只想修改第3个字段,你的整个脚本可能就是:

awk 'BEGIN{FS=OFS=","} {$3=sprintf("%.10f",$3)} 1' text.csv