以下表达式有什么问题:
...
if [ $i -ge ${tLen} ]; then
echo "Maximum limit reached, i=$i"
fi
i=$(($i+1))
...
此表达式位于while
循环内。
i
是计数器变量,其初始值为0。
tLen
存储数组的长度,我正在遍历。
即使true
达到i
,此条件也不会tLen
。我哪里错了?
这是我的完整代码:
read filename
words=(5 2)
i=0
sed 's/ /\n/g' "$filename" >"tmp.txt"
while read word
do
words[i]=$word
i=$(($i+1))
awk "/$word/ {count += 1} END{print count}" "tmp.txt" >>"tmp2.dat"
done <"tmp.txt"
i=0
tLen=${#words[@]}
echo "Length of words: ${tLen}"
declare -A wordMap
while read count
do
if [ $i -ge ${tLen} ]; then
echo "Maximum length reached, i=$i"
break
fi
wordMap["${words[$i]}"]=$count
i=$(($i+1))
done <"tmp2.dat"
rm "tmp.txt"
rm "tmp2.dat"
实际上我正在尝试计算给定文本中每个单词的频率......
答案 0 :(得分:0)
这不是“真实”问题的答案,但如果您只想实际计算文件中的单词:
sed 's/[[:space:][:punct:]]/\n/g;' < testfil | sed '/^$/d' | sort -f | uniq -ci | sort -n
似乎有效。
否则我无法在代码中看到错误,尤其是在最小示例中。尝试在代码的早期插入调试echo
语句或设置set -x
,以获得模拟行为的最小示例。
答案 1 :(得分:0)
对于包含空行或文字之间有多个空格的文本,代码会有问题。在那种情况下,行
wordMap["${words[$i]}"]=$count
会因bad array subscript
消息而失败,因为${words[$i]}
为空。