使用AWK舍入浮点数

时间:2014-03-10 17:12:47

标签: awk printf

我有一个文件b.xyz as,

-19.794325 -23.350704 -9.552335
-20.313872 -23.948248 -8.924463
-18.810708 -23.571757 -9.494047
-20.048543 -23.660052 -10.478968

我想将每个条目限制为三位小数。

我试过这个

awk '{ $1=sprintf("%.3f",$1)} {$2=sprintf("%.3f",$2)} {$3=sprintf("%.3f",$3)} {print $1, $2, $3}' b.xyz

它适用于三列,但如何扩展它以申请n / all列?

1 个答案:

答案 0 :(得分:9)

如果您总是有三个字段,那么您可以使用:

$ awk '{printf "%.3f %.3f %.3f\n", $1, $2, $3}' file
-19.794 -23.351 -9.552
-20.314 -23.948 -8.924
-18.811 -23.572 -9.494
-20.049 -23.660 -10.479

对于未定义的行数,您可以执行以下操作:

$ awk '{for (i=1; i<=NF; i++) printf "%.3f%s", $i, (i==NF?"\n":" ")}' file
-19.794 -23.351 -9.552
-20.314 -23.948 -8.924
-18.811 -23.572 -9.494
-20.049 -23.660 -10.479

它会遍历所有字段并打印出来。当到达最后一个项目时,(i==NF?"\n":" ")会打印一个新行。

甚至(thanks Jotne!):

awk '{for (i=1; i<=NF; i++) printf "%.3f %s", $i, (i==NF?RS:FS)}' file

实施例

$ cat a
-19.794325 -23.350704 -9.552335 2.13423 23 23223.23 23.23442
-20.313872 -23.948248 -8.924463
-18.810708 -23.571757 -9.494047
-20.048543 -23.660052 -10.478968

$ awk '{for (i=1; i<=NF; i++) printf "%.3f %s", $i, (i==NF?"\n":" ")}' a
-19.794 -23.351 -9.552  2.134  23.000  23223.230  23.234 
-20.314 -23.948 -8.924 
-18.811 -23.572 -9.494 
-20.049 -23.660 -10.479 

$ awk '{for (i=1; i<=NF; i++) printf "%.3f %s", $i, (i==NF?RS:FS)}' a
-19.794  -23.351  -9.552  2.134  23.000  23223.230  23.234 
-20.314  -23.948  -8.924 
-18.811  -23.572  -9.494 
-20.049  -23.660  -10.479