我最近对字典中共享“pro-”和“con-”作为前缀的单词感到好奇。例如,游行/让步、生产/引导、坦白/坦白、进步/代表大会等等。我基本上是在寻找与^pro(.+)$
和匹配的任何单词^con(.+)$
,其中捕获组的内容相同。
我最初的穴居人命令是:
sed -nr 's/^con(.+)$/\1/Ip' /usr/share/dict/words | \
xargs -I SUFFIX -n1 grep -i '^proSUFFIX$' /usr/share/dict/words
它似乎有效,只要存在匹配的“pro-”单词,就输出完整的“con-”单词。问题是,速度很慢。它会调用grep
每个潜在的匹配项,要求它每次扫描整个字典。我可以通过制作一个只包含赞成/反对词的临时文件来加快速度,但感觉必须有一些有效的方法来做到这一点而不需要编写文件。
GNU 世界中有没有一种工具非常适合这种交叉搜索?
答案1
从我之前对问题本身的评论来看:
egrep '^(pro|con).* /usr/share/dict/words | sed -nE 's/^(pro|con)(.*)/\2/p' | sort | uniq -d
将为您提供所有同时具有赞成和反对前缀的词库列表:
首字母抓住所有带有和前缀的egrep
单词。然后我们使用从每个单词的开头剥离和,列表,然后使用来显示pro
con
sed
pro
con
sort
uniq -d
奥尼列表中具有重复项的条目。
答案2
这将打印出不带 pro|con 前缀的单词:
grep '^\(pro\|con\)' /usr/share/dict/words | cut -c 4- | sort | uniq -c | awk '$1 == 2 {print $2}'
答案3
在这种特殊情况下 - 已排序的输入,因此所有con...
单词都列在pro...
单词之前 - 您可以用来awk
将匹配的行存储^con
在数组中,当到达匹配的行时^pro
,用替换pro
,con
如果结果在数组中,则打印词根:
awk '/^con/{arr[$0]=$0}; /^pro/{c=gensub(/pro/, "con", 1)
if (c in arr) print substr(c, 4)}' /usr/share/dict/words
…… …… 文斯 文斯 职业 职业的 职业 沃克 沃克德 沃克斯 打电话