【问题标题】:Return n number of lines after grep match from large files从大文件中 grep 匹配后返回 n 行
【发布时间】:2015-05-17 19:56:55
【问题描述】:

我有两个大文件。一个文件有一个我在另一个文件中搜索的行列表。我发现以下代码可以很好地提取 File2 中的匹配行以及简短测试文件中匹配后的 3 行。

当我尝试在大文件(File1 为 1500 万行,File2 为 6300 万行)上运行相同的代码时,可以理解的是,该过程需要很长时间。

有没有办法更快地做到这一点?

代码:

grep -A 3 -xf File1 File2

File1 数据示例:

@M02465:48:000000000-A94WY:1:1101:15033:1350 1:N:0:0
@M02465:48:000000000-A94WY:1:1101:16062:1339 1:N:0:0
@M02465:48:000000000-A94WY:1:1101:15860:1331 1:N:0:0
@M02465:48:000000000-A94WY:1:1101:15810:1334 1:N:0:0

File2 数据示例:

@M02465:48:000000000-A94WY:1:1101:15860:1331 1:N:0:0
TGAGTCACTGGT
+
BBCBBFFFFFFD
@M02465:48:000000000-A94WY:1:1101:15655:1332 1:N:0:0
TCCGACACAATT
+
ABB3ADDBFAFF
@M02465:48:000000000-A94WY:1:1101:15831:1332 1:N:0:0
GACTTGGTATTC
+
A111>1C113B@
@M02465:48:000000000-A94WY:1:1101:15598:1332 1:N:0:0
CCTCGTTCGACT
+
BCCCCDDFCBCD
@M02465:48:000000000-A94WY:1:1101:15810:1334 1:N:0:0
GCTGCTGAGCAT
+
>111111BF111
@M02465:48:000000000-A94WY:1:1101:15895:1334 1:N:0:0
CCTCGTTCGACT
+
>A1>>1>C11?>
@M02465:48:000000000-A94WY:1:1101:16015:1334 1:N:0:0
AATCAGTCTCGT
+
AAAA?@B@BD1>
@M02465:48:000000000-A94WY:1:1101:15715:1335 1:N:0:0
AATCAGTCTCGT
+
BCBCCFFFFFFC
@M02465:48:000000000-A94WY:1:1101:15455:1335 1:N:0:0
AGGCTACACGAC
+
AABAAFFFFBBB

【问题讨论】:

  • 当然需要很长时间。您可以测试ack 等效于 grep
  • @maggick: ack 可以比grep 更快,因为它避免了在无用文件中的搜索。这在这里无济于事。实际上,GNU grep 是为此最精心优化的工具之一。
  • 好的,@lcd047 的 fgrep 响应似乎是最好的。
  • 你能压缩这两个文件并上传到某个地方来测试吗?
  • 这是对未索引文件最好的处理方式。

标签: bash grep pattern-matching large-files


【解决方案1】:

使用fgrep 代替grep。如果您不需要匹配正则表达式,速度会更快:

fgrep -A 3 -xf File1 File2

确保您的模式文件 File1 不包含重复项也可能有所帮助:

sort -u File1 >File1_new

【讨论】:

  • 感谢 lcd047,fgrep 在这种情况下要快得多!
猜你喜欢
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 2013-09-05
相关资源
最近更新 更多