shell grep模糊串匹配

fd3cxomn  于 2023-01-21  发布在  Shell
关注(0)|答案(5)|浏览(261)

我正在尝试匹配包含字符串(例如ACTGGGTAAACTA)的文件中的行。

grep "ACTGGGTAAACTA" file

它会给我一些完全匹配的行。有没有办法允许一定数量的不匹配(替换、插入或删除)?例如,我正在查找序列
1.最多允许3个替换,如“AGTGGGTAACCAA”等。
1.插入/缺失(部分匹配,如“ACTGGGAAAATAAACTA”或“ACTAAACTA”)

mjqavswn

mjqavswn1#

曾经有一个叫做agrep的工具用于模糊正则表达式匹配,但是后来被放弃了。
http://en.wikipedia.org/wiki/Agrep有一些历史和相关工具的链接。
https://github.com/Wikinaut/agrep看起来像是一个复兴的开源版本,但是我还没有测试过它。
如果做不到这一点,看看是否可以为您的发行版找到tre-agrep

gblwokeq

gblwokeq2#

您可以使用tre-agrep并通过-E开关指定edit distance。例如,如果您有一个文件foo

cat <<< EOF > foo
ACTGGGAAAATAAACTA
ACTAAACTA
ACTGGGTAAACTA
EOF

您可以使用最大为9的编辑距离匹配每一行,如下所示:

tre-agrep -s -9 -w ACTGGGTAAACTA foo

输出:

4:ACTGGGAAAATAAACTA
4:ACTAAACTA
0:ACTGGGTAAACTA
raogr8fs

raogr8fs3#

有一个名为fuzzysearch的Python库(我编写的),它精确地提供了所需的功能。
下面是一些应该可以工作的示例代码:

from fuzzysearch import find_near_matches

with open('path/to/file', 'r') as f:
    data = f.read()

# 1. search allowing up to 3 substitutions
matches = find_near_matches("ACTGGGTAAACTA", data, max_substitutions=3)

# 2. also allow insertions and deletions, i.e. allow an edit distance
#    a.k.a. Levenshtein distance of up to 3
matches = find_near_matches("ACTGGGTAAACTA", data, max_l_dist=3)
vyswwuz2

vyswwuz24#

简短回答:没有。
详细答案:正如@JDB所说,regex天生就很精确。您可以手动添加[ATGC]这样的不匹配项,而不是在某些地方添加A,但无法只允许少量的不匹配项。我建议您编写自己的代码来解析它,或者尝试在某处找到DNA解析器。

muk1a3rh

muk1a3rh5#

记住GNU/Linux philosophy,特别是模块化概念,它使我们能够独立地处理小而强大的部分,我们可以聚集一堆这些小部分来创造奇迹,这就是GNU/Linux的美妙之处

cat file | fzf --filter='ACTGGGTAAACTA'

检查fzfhere:)

编辑

fzf --filter='ACTGGGTAAACTA' < file

也可以工作,因为您将file重定向到STDIN,fzf从中读取。

相关问题