Bash Shell直方图展示数据

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 命令,然后通过管道将排序后的结果传给第二部分,以输出直方图

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!