1

我是 unix 和 shell 的新手。我想知道如何用三个变量绘制一个简单的直方图,这些变量将从文件中读取。变量是范围从 1 到 100 的随机数,它们将进入 Y 刻度,X 刻度将是 10 分钟的时间戳。

4

1 回答 1

3

假设数据仅包含整数。

编辑2:

#!/bin/bash
limit=40
xtoggle=true
pad=5
xtitle='Seconds'
footnote='5 second intervals'
ytitle='Number (1-100)'
printf '  %*s\n' "$((limit/2 + ${#ytitle}/2 + pad))" "$ytitle"

printf ' %*d' "$pad" 0
for ((i = 5; i <= limit; i += 5))
do
    printf '%5d' "$i"
done
printf '\n\n'

while read -r -a data
do

    printf -v bar '%*s' "$limit" ''
    for i in "${data[@]}"
    do
        bar=${bar:0:i}x${bar:i+1}
    done
    if $xtoggle
    then
        xc=''
        xtoggle=false
    else
        xc="${xtitle:x++:1}"
        xtoggle=true
    fi
    printf '%-*s' "$pad" "$xc"
    printf '%s\n' "$bar"
done < bardata
if $xtoggle
then
    printf '\n'
fi
for ((i = x; i <= ${#xtitle}; i++))
do
    printf '%s\n\n' "${xtitle:i:1}"
done
printf '\n%s\n' "$footnote"

有了这些数据:

0 5 10
10 13 16
14 3 25
8 4 12
2 20 11
5 17 19
7 8 7
14 19 30
27 22 18
11 19 23
3 33 13
8 5 1
36 18 12

这是输出:

                    Number (1-100)
     0    5   10   15   20   25   30   35   40

     x    x    x
S              x  x  x
        x          x          x
e        x   x   x
       x        x        x
c         x           x x
            xx
o                  x    x          x
                       x   x    x
n               x       x   x
        x         x                   x
d     x   x  x
                 x     x                 x
s




5 second intervals

以前的编辑:

while read -r -a data
do

    for i in "${data[@]}"
    do
        printf -v bar '%*s' "$i" ''

        bar=${bar// /*}

        printf '%s\n' "$bar"
    done
    printf '\n'
done < inputfile

对于此数据:

10 12 13
4 5 6
8 4 7

这是输出:

**********
************
*************

****
*****
******

********
****
*******

原始答案(下面的间接技巧都不是必需的。):

while read -r -a data
do

    for i in "${!data[@]}"
    do
        printf -v "bar$i" '%*s' "${data[i]}" ''

        temp=bar$i
        declare "bar$i"=${!temp// /*}

        printf '%s\n' "${!temp}"
    done
    printf '\n'
done < inputfile
于 2012-05-19T11:55:52.050 回答