awk - 舍入到小数点后两位

dan*_*man 4 command-line awk

我正在使用以下 awk 命令计算文件列中每个项目的百分比:

awk '{a[NR]=$2;x+=(b[NR]=$2);c[NR]=$1}END{while(++i<=NR)print c[i]"\t"a[i]"\t"100*b[i]/x"%"}' file.txt > out_file.txt
Run Code Online (Sandbox Code Playgroud)

文件.txt

N    38668442   
V    14008521   
ADJ  16112215   
Run Code Online (Sandbox Code Playgroud)

输出文件.txt

N    38668442   56,213%
V    14008521   20,3644%
ADJ  16112215   23,4226%
Run Code Online (Sandbox Code Playgroud)

但是,我希望 out_file.txt 中的百分比四舍五入为 2 位小数。

所需的 out_file.txt

N    38668442   56,21%
V    14008521   20,37%
ADJ  16112215   23,42%
Run Code Online (Sandbox Code Playgroud)

参考这篇文章:https : //stackoverflow.com/questions/18696096/awk-calculate-sum-of-2nd-column-and-percentage-wrt-sum-and-print

我试图集成printf "%s,%d,%0.2f%\n到我的代码中,即使通过减少参数并将表达式限制为%0.2f%\n.

 awk '{a[NR]=$2;x+=(b[NR]=$2);c[NR]=$1}END{while(++i<=NR)printf "%s,%d,%0.2f%\n",c[i]"\t"a[i]"\t"100*b[i]/x"%"}' file.txt > out_file.txt
Run Code Online (Sandbox Code Playgroud)

bc没有解决。为什么它不产生所需的输出?在我看来,它应该有效,因为我printf "%0.2f\n"在几个关于同一问题的帖子中找到了表达方式。我错过了一些微不足道的东西吗?

我非常感谢任何帮助或建议!

ste*_*ver 7

您误解了printf命令的语法(它紧跟底层C函数的语法:参见例如man 3 printf完整文档)。

printf采用由一系列格式说明符和其他文字字符组成的格式字符串,后跟尽可能多的逗号分隔参数以填充给定格式。在你的命令中

printf "%s,%d,%0.2f%\n",c[i]"\t"a[i]"\t"100*b[i]/x"%"
Run Code Online (Sandbox Code Playgroud)

你告诉它期望 3 个值(a %s、 a%d和 a %0.2f),但给它一个单一的、连接的、字符串参数c[i]"\t"a[i]"\t"100*b[i]/x"%"。因此,它会在赋值期间用完参数。

你大概想要的是

printf "%s\t%d\t%0.2f%%\n", c[i], a[i], 100*b[i]/x
Run Code Online (Sandbox Code Playgroud)

(制表符进入格式字符串;%%对应于文字%即防止%被解释为另一个格式说明符的开始)。