我已经编写了一个用于阻止英语单词的脚本,它做得不错,但是当我在大文件上使用它时需要永远,这些文件有超过1000个单词,每行一个。有办法加快速度吗?也许完全不同的方法?不同的编程语言?不同的词干?
file=$1
while read -r a
do
b="$(echo "$a" | hunspell -s -d en_US | wc -l)"
if [[ "$b" -eq 2 ]]
then
g="$(echo "$a" | hunspell -s -d en_US | wc -w)"
if [[ "$g" -eq 1 ]]
then
echo "$a" | hunspell -s -d en_US | awk 'FNR==1 {print $1}'
else
echo "$a" | hunspell -s -d en_US | awk 'FNR==1 {print $2}'
fi
else
if [[ "$a" == *ing ]] || [[ "$a" == *ed ]]
then
echo "$a" | hunspell -s -d en_US | awk 'FNR==2 {print $2}'
else
echo "$a" | hunspell -s -d en_US | awk 'FNR==1 {print $1}'
fi
fi
done < "$file"
这是一个例子。
输入文件
cliché
womb
range
strain
fiddle
coup
earnest
touched
gave
dazzling
blindfolded
stagger
buying
insignia
输出
cliché
womb
range
strain
fiddle
coup
earnest
touch
give
dazzle
blindfold
stagger
buy
insignia
如果您运行hunspell -s -d en_US word
,它会根据单词给您不同的结果。选项和要采取的措施如下:
答案 0 :(得分:4)
以下内容会发出完全相同的输出(但是将gave
更改为give
,我的hunspell
似乎没有在其字典中显示 - 而且远远快得多:< / p>
last_word=; stems=( )
while read -r word stem _; do
if [[ $word ]]; then
last_word=$word
[[ $stem ]] && stems+=( "$stem" )
else
if (( ${#stems[@]} == 0 )); then
printf '%s\n' "$last_word" # no stems available; print input word
elif (( ${#stems[@]} == 1 )); then
printf '%s\n' "${stems[0]}" # found one stem; print it.
else
case $last_word in
*ing|*ed) printf '%s\n' "${stems[1]}" ;; # "ing" or "ed": print the 2nd stem
*) printf '%s\n' "${stems[0]}" ;; # otherwise: print the 1st stem
esac
fi
stems=( )
fi
done < <(hunspell -s -d en_US <"$1")
请注意,对于整个文件只运行一次hunspell
,而不是每个单词运行一次;它一遍又一遍地重新启动hunspell
,与bash没有任何关系,你的脚本花费了所有时间。
答案 1 :(得分:-2)
您可能还想考虑案例 如果是案例变量 字1;响应 ESAC
检查手册页以获取正确的语法。它在* nix版本中略有变化