2017-04-15 26 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