文件中有两列数字,第一行如下:
0 0.0
我想将第 1 列中的数字添加到第 2 列中的数字,并且希望保留结果浮点数,而不是整数。因此,即使总和是整数,第一行的结果也应为 0.0,其他行的结果应为 .0。
我尝试过 awk:
awk '{printf "%.1g\n", $0=$1+$2}' > sum.txt
虽然我告诉它保留小数点后一位数字“%.1g\n”,但它仍然给我整数0。
答案1
我在 GNU awk 手册中看不到这一点,但是例如printf()
该函数的手册页在 glibc 中提到了%g
这一点:
从结果的小数部分中删除尾随零;仅当小数点后面至少跟着一位数字时,才会出现小数点。
另外,还有#
“替代格式”的修饰符,它表示:
对于 g 和 G 转换,尾随零不会像其他情况那样从结果中删除。
此外,根据需要%g
自动更改1.23e+3
格式,并且 精确字段(点后的数字)是“最大数量有效数字对于 g 和 G 转换”(不是小数点后的数字),所以我们得到:
printf "%#.1g\n", 0 0.
printf "%#.2g\n", 0 0.0
printf "%#.2g\n", 12 12.
printf "%#.2g\n", 1234 1.2e+03
因此,虽然您可以强制显示小数点,但不能强制显示尾随零。
另一种选择是使用%f
:
printf "%.1f\n", 0 0.0
printf "%.1f\n", 1234 1234.0
或者根据需要在点后添加缺失的零:
a = sprintf("%#.1g", 0); if (substr(a, length(a)) == ".") a = a "0";
答案2
尝试使用以下命令
echo "0 0.0"| awk '{sum=$1+$2;printf "%.1f",sum}'
输出
echo "0 0.0"| awk '{sum=$1+$2;printf "%.2f",sum}'
output
0.0