如何用Unix命令生成重复行的百分比统计直方图?
统计Redfish版本占比的Unix命令方案
需求说明
我有一个名为bmc-versions.txt的文件,内容如下:
"RedfishVersion":"1.6.0" "RedfishVersion":"1.6.0" "RedfishVersion":"1.6.0" "RedfishVersion":"1.6.0" "RedfishVersion":"1.6.0" "RedfishVersion":"1.6.0" "RedfishVersion":"1.15.0" "RedfishVersion":"1.15.0" "RedfishVersion":"1.15.0" "RedfishVersion":"1.15.0" "RedfishVersion":"1.15.0" "RedfishVersion":"1.15.0" "RedfishVersion":"1.15.0"
需要用Unix命令统计各版本的占比百分比,输出格式要求提取版本号并显示对应占比,示例期望输出:
"1.0.0" 50% "1.0.2" 40%
目前已尝试的命令:
sort bmc-versions.txt | uniq -cd
该命令能输出各版本的重复次数,但无法直接得到占比。
解决方案
基础占比统计命令
使用以下命令可以直接生成你需要的格式输出:
total=$(wc -l < bmc-versions.txt); sort bmc-versions.txt | uniq -cd | awk -v total="$total" '{percent=sprintf("%.0f%%", ($1/total)*100); gsub(/.*:"([^"]+)"/, "\"\\1\"", $2); print $2, " " percent}'
命令解释:
total=$(wc -l < bmc-versions.txt):计算文件总行数并存入变量totalsort bmc-versions.txt | uniq -cd:对内容排序后,统计每个重复行的出现次数awk处理逻辑:- 接收总行数变量,计算当前版本的占比并格式化为整数百分比
- 用
gsub提取行中的版本号(从"RedfishVersion":"x.x.x"中提取"x.x.x") - 按指定格式输出版本号和占比
带直方图的增强版输出
如果需要可视化的直方图结果,可以使用以下命令:
total=$(wc -l < bmc-versions.txt); sort bmc-versions.txt | uniq -cd | awk -v total="$total" '{percent=($1/total)*100; bar_length=int(percent/2); gsub(/.*:"([^"]+)"/, "\"\\1\"", $2); printf "%-12s %3.0f%% ", $2, percent; for(i=0;i<bar_length;i++) printf "*"; print ""}'
针对测试文件的示例输出:
"1.6.0" 46% ********************** "1.15.0" 54% ***************************
内容的提问来源于stack exchange,提问作者Node.JS
相关产品推荐
相关产品推荐

