1

我有一个文件(patterns.txt),其中包含一个以换行符分隔的模式列表,例如:

AAAA........
....CCCC....
........YYYY
ATCC

我正在搜索的文件(table.txt)包含如下所示(大小为 120gb):

ZZZZAAAAGTGT    0   1   12
AAAAGTGTAAYY    0   9   1
GGGGTTTTCCCC    1   0   0
HHHHHHHHYYYY    1   8   0
AAATCCCHHHHH    0   0   1

我正在使用以下 grep 命令:

grep -f patterns.txt table.txt

这将返回我的示例中的所有行。但是,如果我可以强制 grep 只查看前 12 个字符,则不会返回第一行和第三行(这是理想的)。

这个 grep 是一个更大程序的一部分。这意味着模式必须来自文件。但如果需要,我可以更改文件的内容。

我正在考虑用字符类 [ACGTHY] 替换所有点。这意味着模式AAAA........将变为:

AAAA[ACGTHY][ACGTHY][ACGTHY][ACGTHY][ACGTHY][ACGTHY][ACGTHY][ACGTHY]

这应该提供所需的结果,但它似乎很慢。有没有更好的方法来做到这一点?

编辑:我也在考虑用 \S 替换点。

4

2 回答 2

2

你需要一些更强大的东西。尝试使用awk

awk 'FNR==NR { a[$1]++; next } { for (i in a) if ($1 ~ i) print }' patterns table

结果:

AAAAGTGTAAYY    0   9   1
HHHHHHHHYYYY    1   8   0
AAATCCCHHHHH    0   0   1
于 2012-11-21T23:26:04.457 回答
1

你能修改patterns.txt吗?

在这种情况下,^在每行之前添加一个就可以了。只有当它们开始一行时,这才会匹配您的模式。

于 2012-11-21T14:58:08.793 回答