1

我正在尝试在文件中进行字数统计,并将文件中的每个单词用作关联数组中的键。该值应该是单词的出现次数。

while read line; do
  ((occs["$line"]=${occs[$line]}+1))
done < $predfile

现在的问题是文件中可以有一个 *(星号),我想把这个星号当作一个词。但是,当我想输出单词的出现时

for i in "${!occs[@]}"
do
  echo "$i : ${occs[$i]}" >> $resultfile
done

然后 bash 在到达星星时尝试输出 ${occs[*]} 并且我得到“occs[*]: bad array subscript”。我可以使用 if 语句来处理这个问题,但我想知道是否可以用转义键填充数组键。

4

1 回答 1

1

当您尝试分配数组元素时会发生错误,而不是在使用它时。*并且@作为数组下标具有特殊含义,显然 bash 不会让您将这些值用作常规数组下标。你必须*特别处理@

数组下标必须是整数。如果要将任意单词存储为数组键,则需要将变量声明为关联数组。

declare -A occs
while read line; do 
    [[ $line = "*" ]] && line=star
    [[ $line = "@" ]] && line=asterisk
    ((occs["$line"]++))
done < <(printf "%s\n" a b c \* \* c b a \* 1 2 3 \@)

for key in "${!occs[@]}"; do 
    printf "%s\t%d\n" "$key" "${occs[$key]}"
done | column -t
star      3
a         2
b         2
c         2
asterisk  1
1         1
2         1
3         1
于 2013-10-25T17:44:57.797 回答