直方图使用bash
问题描述:
目前我使用:直方图使用bash
#!/bin/bash
while read line
do
((histogram[${#line}]++))
done < "${1:-/dev/stdin}"
for length in "${!histogram[@]}"; do
printf "%-1s %s\n" "${length}" "${histogram[$length]}"
done
生成柱状图输出。但是如果没有长度的行,输出会自动忽略它们。有什么办法让函数不会忽略这些行吗?有任何想法吗?
答
你的意思是说你想打印一个零为每个不发生长度达到最大长度?如果是这样的:
$ cat test.sh
#!/bin/bash
while read line
do
((histogram[${#line}]++))
done < "${1:-/dev/stdin}"
max=0
for length in "${!histogram[@]}"
do
if [ $length -gt $max ]
then
max=$length
fi
done
for length in $(seq 0 $max)
do
printf "%-1s %s\n" "${length}" "${histogram[$length]-0}"
done
实施例运行:
$ printf 'x\nfoo\n' | ./test.sh
0 0
1 1
2 0
3 1
答
击默认使用稀疏数组。例如。这里可能是holes
在数组中。您可以通过预先初始化(填充)数组来避免它们。当然,你需要估计最大指数。例如当你将运行像
printf "%s\n" 1 123 123 123456 | bash the_script
之后添加到顶部
histogram=($(printf "%0.s0\n" {1..10})) # generate 10 zeroes
您将获得:
0 0
1 1
2 0
3 2
4 0
5 0
6 1
7 0
8 0
9 0
或,如果你不想事先初始化,您需要检查给定成员的存在,并为每一个做周期
while read line
do
((histogram[${#line}]++))
done < "${1:-/dev/stdin}"
max=$(printf "%s\n" "${!histogram[@]}" | sort -nr | head -1)
for ((length=0; length<=max; length++)) {
val=${histogram[$length]:-0}
printf "%-1s %s\n" "${length}" "$val"
}
例如对于上述printf "%s\n" 1 123 123 123456 | bash the_script
0 0
1 1
2 0
3 2
4 0
5 0
6 1
聪明的脚本,但它不清楚你期望的结果是什么。你能提供一个预期的输入和输出的例子吗? – l0b0