1

私はUnixとシェルが初めてです。ファイルから読み取られる 3 つの変数を使用して単純なヒストグラムを描画する方法を知りたいです。変数は 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 に答える