在另一个文件中查找大文件中的行的最快方法

Els*_*ris 4 linux bash grep while-loop

我在 while 循环中使用 grep 在另一个文件中查找一个文件中的行并将输出保存到新文件中。我的文件非常大(2.26 亿行),并且脚本需要很长时间(12 天并且还在增加)。您有加快速度的建议吗?也许有比 grep 更好的方法?

(我还需要前一行的输出,因此 grep -B 1。)

这是我的代码:

#!/bin/bash

while IFS= read -r line; do
  grep -B 1 $line K33.21mercounts.bf.trimmedreads.dumps.fa >> 21mercounts.bf.trimmedreads.diff.kmers.K33;
done <21mercounts.bf.trimmedreads.diff.kmers 

Run Code Online (Sandbox Code Playgroud)

更新:

包含要查找的行的输入文件大小为 4.7 GB,有 226 mio 行,如下所示:

AAAGAAAAAAAAAGCTAAAAT
ATCTCGACGCTCATCTCAGCA
GTTCGTCGGAGAGGAGAGAAC
GAGGACTATAAAATTGTCGCA
GGCTTCAATAATTTGTATAAC
GACATAGAATCACGAGTGACC
TGGTGAGTGACATCCTTGACA
ATGAAAACTGCCAGCAAACTC
AAAAAACTTACCTTAAAAAGT
TTAGTACACAATATCTCCCAA
Run Code Online (Sandbox Code Playgroud)

要查看的文件大小为 26 GB,有 20 亿行,如下所示:

>264638
AAAAAAAAAAAAAAAAAAAAA
>1
AAAGAAAAAAAAAGCTAAAAT
>1
ATCTCGACGCTCATCTCAGCA
>1
GTTCGTCGGAGAGGAGAGAAC
>28
TCTTTTCAGGAGTAATAACAA
>13
AATCATTTTCCGCTGGAGAGA
>38
ATTCAATAAATAATAAATTAA
>2
GAGGACTATAAAATTGTCGCA
>1
GGCTTCAATAATTTGTATAAC

Run Code Online (Sandbox Code Playgroud)

预期的输出将是这样的:

>1
AAAGAAAAAAAAAGCTAAAAT
>1
ATCTCGACGCTCATCTCAGCA
>1
GTTCGTCGGAGAGGAGAGAAC
>2
GAGGACTATAAAATTGTCGCA
>1
GGCTTCAATAATTTGTATAAC
Run Code Online (Sandbox Code Playgroud)

anu*_*ava 6

grep -f您可以在不使用 shell 循环并使用固定字符串搜索的情况下尝试此命令:

grep -B1 -Ff 21mercounts.bf.trimmedreads.diff.kmers \
 K33.21mercounts.bf.trimmedreads.dumps.fa > 21mercounts.bf.trimmedreads.diff.kmers.K33
Run Code Online (Sandbox Code Playgroud)