我正在尝试在文件中进行单词计数,并使用文件中的每个单词作为关联数组中的键。值应该是单词的出现。
while read line; do
((occs["$line"]=${occs[$line]}+1))
done < $predfile
现在的问题是文件中可能有*(星号),我想将这个星形视为一个单词。但是当我想用
输出单词的出现时for i in "${!occs[@]}"
do
echo "$i : ${occs[$i]}" >> $resultfile
done
然后bash trys在到达星星时输出$ {occs [*]}并得到“occs [*]:bad array subscript”。我可以使用if语句来处理这个,但我想知道我是否可以用转义键填充数组键。
答案 0 :(得分: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