Bash Shell直方图展示数据,你需要为一些数据生成快捷的屏幕直方图。
解决方案
使用 awl统计字符串出现次数讨论过的 awk 关联数组。
#!/usr/bin/awk -f
# 实例文件:hist.awk
# 用Awk生成直方图
# 用法:ls -lR /usr/local | hist.awk
function max(arr, big)
{
big = 0;
for (i in user)
{
if (user[i] > big) { big=user[i];}
}
return big
}
NF > 7 {
user[$3]++
}
END {
# 进行缩放
maxm = max(user);
for (i in user) {
#printf "%s owns %d files\n", i, user[i]
scaled = 60 * user[i] / maxm ;
printf "%-10.10s [%8d]:", i, user[i]
for (i=0; i<scaled; i++) {
printf "#";
}
printf "\n";
}
}
awl统计字符串出现次数中的输入来运行该脚本,可以得到:
$ ls -lR /usr/local | awk -f hist.awk
bin [ 68]:#
albing [ 1801]:#######
root [ 13755]:##################################################
man [ 11491]:##########################################
$
讨论
我们可以将 max 对应的那部分代码放进 END 代码块的开头,但这里是想告诉你也可以在 awk 中定义函数。这里用到了一个比较复杂的 printf 语句。字符串格式 %-10.10s
会将字符串左对齐并填充至 10 个字符宽,同时限制长度为 10 个字符,多出的字符会被全部截断。整数格式 %8d
确保输出的整数宽度为 8 个字符。通过使用相同的屏幕空间(无论用户名的长度或整数大小是多少),可以确保每个直方图的起始位置相同。
与 awk 中的所有算术运算一样,缩放计算使用浮点数完成,除非调用内建的 int()
函数来明确截断结果。我们没有这么做,这意味着 for 循环至少会执行一次,这样一来,最少量的数据也会显示一个 #
标记。
for(i in user) 循环返回的数据并不遵循特定顺序,可能是基于底层散列表的某些便利排序(convenient ordering)。要想按照文件数量或用户名排序显示直方图,那就得加入一些排序处理。一种方法是将脚本拆成两部分,将第一部分的输出发送给 sort 命令,然后通过管道将排序后的结果传给第二部分,以输出直方图。
酷客网相关文章:
评论前必须登录!
注册