Bash Shell bash实现直方图,你想在不借助外部程序的情况下用 bash 计算并绘制直方图。有没有可能?
解决方案
当然没问题,这多亏了关联数组。bash 4.0 及更高版本都可使用。可以将 bash统计字符串出现次数中的代码作为基础,唯一的不同在于输出部分。首先,遍历所有的数组元素值来找出其中的最大值,然后以此对直方图输出进行缩放以适应页面大小。
BIG=0
for VALS in "${!UCOUNT[@]}"
do
if (( UCOUNT[$VALS] > BIG )) ; then BIG=${UCOUNT[$VALS]} ; fi
done
有了最大值(保存在 BIG 中)后,为每个数组元素输出一行。
#
# 输出直方图
#
for VALS in "${!UCOUNT[@]}"
do
printf "%-9.9s [%7d]:" $VALS ${UCOUNT[$VALS]}
# 缩放至最大值(BIG);注:整数
SCALED=$(( ( (59 * UCOUNT[$VALS]) / BIG) +1 ))
for ((i=0; i<SCALED; i++)) {
printf "#"
}
printf "\n"
done
讨论
与 管道中进行搜索中一样,${!UCOUNT[@]}
至关重要。可以通过它得到数组的索引值列表(这个示例为数组 UCOUNT)。for 循环每次获得一个值,并用它作为数组索引来获得该用户的文件数量。
我们将直方图缩放至 59 个字符宽度,然后再多加 1 个字符宽度,这是为了令任何非 0 值 都能在直方图上至少生成一个标记。这在 awk 版本 中不是什么问题,因为 awk 使用的是浮点运算,但 bash 版本使用的是整数运算,执行除法后,过小的值会变成 0。
酷客网相关文章:
评论前必须登录!
注册