2017-04-15 22 views
7

目前我使用:直方图使用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 

生成柱状图输出。但是如果没有长度的行,输出会自动忽略它们。有什么办法让函数不会忽略这些行吗?有任何想法吗?

+1

聪明的脚本,但它不清楚你期望的结果是什么。你能提供一个预期的输入和输出的例子吗? – l0b0

回答

1

你的意思是说你想打印一个零为每个不发生长度达到最大长度?如果是这样的:

$ 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 
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