我正在使用以下 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"在几个关于同一问题的帖子中找到了表达方式。我错过了一些微不足道的东西吗?
我非常感谢任何帮助或建议!
您误解了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)
(制表符进入格式字符串;%%对应于文字%即防止%被解释为另一个格式说明符的开始)。
| 归档时间: |
|
| 查看次数: |
3242 次 |
| 最近记录: |