我是unix和shell的新手。我想知道如何绘制一个简单的直方图,其中包含三个将从文件中读取的变量。变量是随机数,范围从1到100,它们将进入Y标度,X标度将是10分钟的时间标记。
答案 0 :(得分: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