【发布时间】:2015-10-28 06:59:03
【问题描述】:
我编写了一个用于提取英语单词的脚本,它做得不错,但是当我在大文件上使用它时需要很长时间,这些文件有 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,它可以根据一个词给你不同的结果。选项和要采取的措施如下:
- 一行一字(打印那个字)
- 一行两个字(打印第二个字)
- 两行两字;以“ing”或“ed”结尾(在第二行打印第二个单词)
- 两行两字;不以“ing”或“ed”结尾(在第一行打印第一个单词)
【问题讨论】:
-
不要重复自己。您对每个单词运行
echo "$a" | hunspell -s -d en_US两到三遍。不要那样做。只需执行一次并保存即可。 bash 在运行这样的大文件方面也不是最快的。使用其他东西(甚至只是 awk)可能会快得多。如果hunspell可以在您可以可靠读取的流模式下运行,那么您可以做到这一点。 -
不是
ifs 拖慢了你的脚本;这是您在条件中放入的所有子shell。 -
您可以在运行一个
echo "$a" | hunspell -s -d en_US | awk 'FNR==1 {print $1}'所需的执行时间内运行if [[ "$a" == *ing ]] || [[ "$a" == *ed ]]; then :; fi一千次。管道很昂贵;旋转外部工具很昂贵!学习使用本机 bash 字符串操作。 -
另外,如果此代码有效并且您只需要帮助使其变得更好,那么这个问题比这个网站更适合codereview.stackexchange.com。
-
...顺便说一句,这个脚本中的大多数分支打算处理什么情况是非常不明显的。评论会很有帮助,或者至少选择测试数据以实际执行所有提供的逻辑。