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

Unix 如何用数字和小数格式化字符串?,unix,awk,string-formatting,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”正

我的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”或“%”符号有关。知道正确的命令是什么吗?

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

此外,双
printf
显然是多余的

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

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

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

因此,包含
%
字符的
sprintf
的输出是
printf
的第一个参数,这就是arg格式。如果您将其更改为:

printf "%s", sprintf("%s,%d,%.10f\n",$1,$2,$3)
这样你就不会有问题了,但是sprintf当然是多余的,因为你可以写:

printf "%s,%d,%.10f\n",$1,$2,$3
在这种情况下,由于您确实只想修改第三个字段,所以整个脚本可以是:

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

太棒了,谢谢!如果我想用连接版本替换文件中的浮动,那么将awk命令的输出通过管道传输到新文件是最好的方法吗?这个文件相当大(350万行),我不确定我是否理解你的后续问题,但是,是的,保存到一个新文件,然后用它替换原始文件是正确的做法。出于好奇,脚本末尾的1是什么意思?awk脚本是一系列的
{}
语句,其中默认操作是打印当前记录,因此当您编写一个常量非零、非空条件(如
1
“foo”
)时,它是一个真实条件,因此调用打印当前记录的默认操作。这是一个非常常见的awk习语,它不仅简短,而且迫使您理解awk语言的基本思想/结构。
awk 'BEGIN{FS=OFS=","} {$3=sprintf("%.10f",$3)} 1' text.csv