如何用更快的东西替换agrep?

时间:2015-05-27 14:01:26

标签: string grep match

我目前正在使用近似grep(Agrep)来获取数千个短字符串列表与数百万个较长字符串列表之间的匹配。

任务:

找到' ABCD'在' ABCDE',' ... XYZABCDEFG ...'甚至' ... XYZqBCDEFG ......' (1不匹配)

agrep运行正常,但它对于我必须做的事情来说太慢了(字符串匹配1个不匹配)。任何人都可以推荐更快的替代方案吗?

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)的文件中读取正则表达式。