我目前正在使用近似grep(Agrep)来获取数千个短字符串列表与数百万个较长字符串列表之间的匹配。
任务:
找到' ABCD'在' ABCDE',' ... XYZABCDEFG ...'甚至' ... XYZqBCDEFG ......' (1不匹配)
agrep运行正常,但它对于我必须做的事情来说太慢了(字符串匹配1个不匹配)。任何人都可以推荐更快的替代方案吗?
答案 0 :(得分:3)
我不知道这个答案的表现会与你现在的表现相比如何。
从
开始one_mismatch_regex() {
local patterns
for ((i=0; i < ${#1}; i++)); do
patterns+=( "${1:0:i}.${1:i+1}" )
done
local IFS='|'
echo "${patterns[*]}"
}
这样做:
$ one_mismatch_regex foobar
.oobar|f.obar|fo.bar|foo.ar|foob.r|fooba.
所以:
while read search_word; do
one_mismatch_regex "$search_word"
done < searches.txt |
grep -E -f - data.txt
while循环会将搜索词列表转换为匹配单词与一个不匹配的正则表达式,并将正则表达式写入stdout。然后,grep将使用扩展的正则表达式匹配(-E
)并从名为-
(stdin)的文件中读取正则表达式。