grep 在单个文件上多次



我有一个带有入藏号的文件。这些数字需要根据ID映射到另一个文件中,并使用该信息和补充的mysql数据库信息编写第三个文件。我有一个简单的程序,它可以读取文件(145Gb(,提取入藏号,然后使用grep命令将相应的ID查找到映射文件(10Gb(中。 因此,对于每个入藏号,我正在执行一个 grep:

$ grep -m1 myAccession myMappFile

此操作将执行多次。当我一遍又一遍地访问同一个文件时,我想知道是否有一种简单的方法来创建索引或某种 bash 魔法来提高性能,因为我必须处理大约 4500 万个种质。 我已经在 ~3 小时内处理了 250k 种质。 因此处理 45M 大约需要 ~540 小时(22 天!!! 我知道我可以对发送一个具有多个种质的 grep 进行一些改进:

$ grep  'accession1|accession2|accession3' -m3 myMappFile

然而,这还不够。

也许像这样:

$ grep  'accession1|accession2|accession3' -m3 myIndexedMappFile

注意:数据库过程已经得到改进,我通过使用哈希图大大减少了数据库访问,因此瓶颈肯定位于 grep 上。

有什么想法吗?

更新:

*File with accession:*
>Accession_A other text
other line
...
...
>Accession_B more text
more lines
...
*File with mappings*
Col1  Accession_A   ID-X  Col4
Col1  Accession_B   ID-Y  Col4
...
...

因此,程序读取入藏文件(逐行(提取Accession_N,然后在映射文件上为该入藏进行 grep。使用结果行,我提取 ID 值,使用该 ID 在数据库中搜索更多数据,因此最后我有一个文件:

Accession_A ID-X DB-DATA

Accession_B ID-Y DB-DATA

不对任何文件进行排序。我将值 {ID, DB-DATA} 放入哈希映射中以避免数据库开销。

该程序是用java编码的,使用进程来执行grep命令,以减少运行时.exec调用的开销我尝试一次运行具有多个种质的grep,但它几乎相同...

我已经解决了@sundeep的建议,并在处理时间方面找到了解决方案,但是我认为当用户需要对同一个文件执行多个 grep 时,这仍然应该是改进用例的更好方法。 我所做的是:

首先从第一个文件中提取所有入藏号:

grep -e "^>" myBigFile.fa | cut -d">" -f2 | cut -d" " -f1   > all_accession.txt

然后将 grep 与文件引用一起使用

grep -F -f all_accession.txt myBigMappingFile > matchFile.txt

最后使用 java 程序处理 matchFile.txt以便读取 ID 并创建目标文件(对于过程,我的意思是只需读取 ID 并查看数据库中的补充信息(。

这三个步骤在 3.5 小时内执行,这更容易接受。 但是,该解决方案并不完整,因为一起运行(正如我从一开始就一直在尝试的那样(还会生成其他输出文件,最重要的是,一个包含映射文件上没有相应 id 的种质的文件,因此我尝试使用以下命令生成该文件:

grep -F -v -f all_accession.txt myBigMappingFile > matchFile.txt

grep 与 -v 参数为了反转选择,但该命令还给出了 myBigMappingFile 上的记录,该记录在all_accession.txt不是所需输出的文件上找不到匹配项......

最新更新