【问题标题】:Drawing a histogram from a file从文件中绘制直方图
【发布时间】:2019-03-29 17:21:44
【问题描述】:

我正在做学校项目,但我不知道如何使用 AWK 绘制直方图。

这是我需要的:

变量 1 (8):########
变量 2 (4):####
变量 3 (2):##
变量 4 (2):##
变量 5 (2):##
变量 6 (1):#
变量 7 (1):#
变量 8 (1): #

awk '{n[$1]++} END {for (i in n) print i,"("n[i]"):"} file | sort -n

变量 1 (8):
变量 2 (4):
变量 3 (2):
变量 4 (2):
变量 5 (2):
变量 6 (1):
变量 7 (1):
变量8(1):

所以我需要添加 #s

【问题讨论】:

  • 发布一些应该产生该输出的示例数据。

标签: bash awk histogram


【解决方案1】:
awk '
    { n[$1]++ }
    END {
        for (i in n) {
            bar = sprintf("%*s",n[i],"")
            gsub(/ /,"#",bar)
            printf "%d\t%s (%d): %s\n", n[i], i, n[i], bar
        }
    }
' file | sort -rn | cut -f2-

【讨论】:

    【解决方案2】:

    awk 中的另一个。在缺乏使用数字的适当样本数据的情况下:

    $ cat file
    8
    4
    ...
    

    Awk:

    $ awk '{h=sprintf("%0" $1 "d",0);gsub(/0/,"#",h);print $1,h}' file
    

    输出:

    8 ########
    4 ####
    2 ##
    2 ##
    2 ##
    1 #
    1 #
    1 #
    

    解释:

    $ awk '{
        h=sprintf("%0" $1 "d",0)  # use 0s for the histogram chars
        gsub(/0/,"#",h)           # replace with #s
        print $1,h                # output
    }' file
    

    【讨论】:

    • 另一种方法是bar = sprintf("%*s", $1, ""); gsub(/ /, "#", bar)——唯一的好处是将宽度作为参数传递给 sprintf 而不是动态构造格式字符串。
    猜你喜欢
    • 2020-10-24
    • 2016-10-08
    • 1970-01-01
    • 2014-02-07
    • 2016-07-03
    • 2014-07-05
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多