首页 > 解决方案 > 从文件中提取染色体模式

问题描述

我有一个模式是染色体坐标,例如:

chr1 1000 2000 chr1 11000 12000

对于单个模式,我使用以下查询:

grep 'chr1\s\+1000\s\+2000\s\+chr1\s\+11000\s\+12000' DB_file.txt

对于此类模式的完整列表,我有一个查询文件:

cat query.txt
chr1\s\+1000\s\+2000\s\+chr1\s\+10000\s\+11000
chr1\s\+1000\s\+2000\s\+chr1\s\+14000\s\+15000
chr1\s\+1000\s\+2000\s\+chr1\s\+175000\s\+176000
chr1\s\+1000\s\+2000\s\+chr1\s\+1639000\s\+1640000

我怎样才能做到这一点 ?grep -f 花费的时间太长。谢谢

DB_file.txt 的示例

chr1    1000    2000    chr1    10000   11000   3   281 0   0.459585414218248   0   0   0   1218    1   1.88650643678468    0   0   0   0.000000425582664277006 3.87833663319237    0.000000425597761316606 0.201115300038799   0.743522481235195   0.822936566866982
chr1    1000    2000    chr1    11000   12000   4   281 0   0.459585414218248   0   0   0   459 1   0.710924839477969   0   0   0   0.000000355375953311341 1.75327208538672    0.000000192399150742434 0.068194541602096   0.101318817290739   0.81707019750747
chr1    1000    2000    chr1    12000   13000   5   281 0   0.459585414218248   0   0   0   1415    1   2.19163104109222    0   0   0   0.000000310867653966458 3.44281554060217    0.000000377804900731428 0.128881860609444   0.263803805858084   0.81707019750747
chr1    1000    2000    chr1    13000   14000   1   281 0   0.459585414218248   0   0   0   437 1   0.676850010570529   0   0   0   0.000000285200375223444 1.49690344452761    0.000000164265976667856 0.335040184988013   0.776177861586765   0.837324774202159
chr1    1000    2000    chr1    14000   15000   1   281 0   0.459585414218248   0   0   0   530 1   0.820893605497437   0   0   0   0.000000271516726063383 1.60662404023105    0.000000176306406449545 0.322230259464951   0.799436461434159   0.850447555722604
chr1    1000    2000    chr1    16000   17000   1   281 0   0.459585414218248   0   0   0   490 1   0.758939371120272   0   0   0   0.000000253854147173018 1.41695624386548    0.000000155492795574155 0.343542270137564   0.75754917047966    0.828368055880824
chr1    1000    2000    chr1    18000   19000   2   281 0   0.459585414218248   0   0   0   130 1   0.201351261725787   0   0   0   0.000000231422263301451 0.691389012939271   0.0000000758710869983566    0.119714987783608   0.152817308925748   0.81707019750747

编辑: DB_file.txt 很大,有 4636593 行,因为 grep 花费的时间太长。我怎样才能加快速度?谢谢

标签: awkgrep

解决方案


看起来您的字段DB_File.txt由制表符分隔,而不是任意空格。如果是这种情况,如果您将query.txt文件更改为使用 TSV 数据,则可以使用

grep -Ff query.txt DB_File.txt

这应该比正则表达式版本更快。

要将现有query.txt文件更改为使用文字选项卡:

perl -pi -e 's/\Q\s\+/\t/g' query.txt

如果您要经常使用此数据文件,另一种选择是将其导入 sqlite 数据库(或 postgres 或其他),并在创建适当的索引后使用 SQL 查询它,这样整个表就不必被扫描。


推荐阅读