【问题标题】:Grep chromosome patterns from a file从文件中提取染色体模式
【发布时间】:2020-03-30 22:01:13
【问题描述】:

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

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 花费的时间太长。我怎样才能加快速度?谢谢

【问题讨论】:

  • 那么,grep -f query.txt 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.822936566866982chr1 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
  • 其实我的 DB_File 是一个非常大的文件(4636593 行)。当我使用 grep 时,它需要很长时间。有什么办法可以加快速度吗?

标签: awk grep


【解决方案1】:

您的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 查询它,以便整个表不会不必扫描。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多