我的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'或者'%'标志。知道正确的命令是什么吗?
答案 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