我想获得BSD词典单词列表中每个单词的前两个字母,不包括那些只以一个字母开头的单词。
如果没有单字母排除,它运行得非常快:
time cat /usr/share/dict/web2 | cut -c 1-2 | tr '[a-z]' '[A-Z]' | uniq -c > /dev/null
real 0m0.227s
user 0m0.375s
sys 0m0.021s
然而,点击“..
”的过程非常缓慢:
time cat /usr/share/dict/web2 | cut -c 1-2 | grep '..' | tr '[a-z]' '[A-Z]' | uniq -c > /dev/null
real 1m16.319s
user 1m0.694s
sys 0m10.225s
这里发生了什么?
答案 0 :(得分:9)
Mac上真正慢的是UTF-8语言环境。
将grep ..
替换为LC_ALL=C grep ..
,然后您的命令运行速度将提高100倍。
对于Linux来说也是如此,除了给定的Linux发行版可能更有可能默认为C环境。
答案 1 :(得分:2)
我不知道为什么会这么糟糕。但我知道加快速度的一种快捷方法是将grep(1)
表达式反转为{{1}},并丢弃所有单字符行:
-v
答案 2 :(得分:1)
这可能会更好一些,也可以摆脱需要另一根烟斗的切割。
cat /usr/share/dict/web2 | egrep -o '^.{2,}' | tr '[a-z]' '[A-Z]' | uniq -c > /dev/null
答案 3 :(得分:1)
$ awk '{ a[toupper(substr($0,1,2))]++ } END{for(i in a) print i,a[i] }' file