我有一个文件(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替换点。答案 0 :(得分: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
答案 1 :(得分:1)
你能修改patterns.txt吗?
在这种情况下,在每行之前添加^
就可以了。只有当他们开始一行时,这才会匹配您的模式。