使用AWK对浮点数进行舍入

使用AWK对浮点数进行舍入,awk,printf,Awk,Printf,我有一个文件b.xyz作为 -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

我有一个文件b.xyz作为

-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列?

如果始终有三个字段,则可以使用:

$ 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
例子
$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您的示例数据没有意义,4行输入,6行输出?-19.794345应该舍入到-19.794,在我的测试中是这样,但在您的示例输出中不是这样。(我确认第1行的字段3没有舍入,我不理解。)。请更新您的问题,而不是在评论中回答。祝您好运。它会将每行打印两次!我会将
(I==NF?\n:“)
更改为
(I==NF?RS:FS)
,并且可能会将一些高尔夫球更改为:
awk'{for(I=1;非常好,@Jotne,谢谢!刚刚更新以反映其他可能性(注意,在您的评论中,您遗漏了
%s
部分)不,我没有遗漏
%s
,如果您看,我已经移动了
(I==NF?RS:FS)
的另一面,
因此它只是替换了一个额外的数据输入,即高尔夫部分。这是一个很好的回答的附加问题:如何添加“千”的格式?因此,在您的示例中,“23223.230”将变成“23223.230”。我现在有了这个
awk'{printf(“%'\''''.2f\n',$0)}awk'{printf(“%'\''d\n',$0)}'
,但这似乎不起作用。..@SanderW.vanderLaan使用中所述的
'
。例如,如果我键入
LC\u NUMERIC=en\printus awk'{f(“%'\'f\n',$0)}”
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