如何编辑 300 GB 的文本文件(基因组数据)?

Posted

技术标签:

【中文标题】如何编辑 300 GB 的文本文件(基因组数据)?【英文标题】:How to edit 300 GB text file (genomics data)? 【发布时间】:2013-05-29 20:08:05 【问题描述】:

我有一个 300 GB 的文本文件,其中包含超过 25 万条记录的基因组数据。有一些记录包含不良数据,我们的基因组学程序“Popoolution”允许我们用星号注释掉“不良”记录。我们的问题是我们找不到可以加载数据的文本编辑器,以便我们可以注释掉不良记录。有什么建议?我们有 Windows 和 Linux 机器。

更新:更多信息

Popoolution (https://code.google.com/p/popoolation/) 程序在到达“坏”记录时崩溃,该记录为我们提供了行号,然后我们可以将其注释掉。具体来说,我们从 Perl 收到一条消息,上面写着“F#€%& Scaffolding”。该手册建议我们可以只使用星号来注释掉坏行。可悲的是,我们将不得不多次重复这个过程......

再想一想……有没有一种方法可以让我们在行中添加星号,而无需一次打开整个文本文件。考虑到我们将不得不重复这个过程未知的次数,这可能非常有用。

【问题讨论】:

为什么需要在文本编辑器中打开它?您肯定不会手动评论所有 250k 记录吗?看看使用 awk 或 sed。 为那些不良记录找到一个模式并使用 awk 或 sed 解决问题,正如@Joshua 所指出的那样。需要手动检查 25 万条记录意味着一生。 我们尝试在记事本++中加载文件,加载时间超过24小时,基本可以使用。 刚刚找到一个有用的话题:***.com/questions/159521/… 350,000,000,000 字节和 250,000 条记录大约是每行一兆字节。这不是文本文件的工作。获取合适的数据库。只是说。 【参考方案1】:

根据您的更新:

再想一想...有没有一种方法可以让我们添加 将星号添加到行中,而无需立即打开整个文本文件。 这可能非常有用,因为我们将不得不重复 处理未知次数。

这里你有一个方法:如果你知道行号,你可以在该行的开头添加一个星号:

sed 'LINE_NUMBER s/^/*/' file

看一个例子:

$ cat file
aa
bb
cc
dd
ee
$ sed '3 s/^/*/' file
aa
bb
*cc
dd
ee

如果添加-i,文件将被更新:

$ sed -i '3 s/^/*/' file
$ cat file
aa
bb
*cc
dd
ee

尽管我一直认为重定向到另一个文件会更好

sed '3 s/^/*/' file > new_file

这样您就可以保持原始文件的完整性,并将更新后的文件保存在new_file

【讨论】:

【参考方案2】:

R 中的一个基本模式是分块读取数据、编辑和写出

fin = file("fin.txt", "r")
fout = file("fout.txt", "w")
while (length(txt <- readLines(fin, n=1000000))) 
    ## txt is now 1000000 lines, add an asterix to problem lines
    ## bad = <create logical vector indicating bad lines here>
    ## txt[bad] = paste0("*", txt[bad])
    writeLines(txt, fout)

close(fin); close(fout)

虽然不理想,但它适用于 Windows(通过提到 Notepad++ 暗示)和您可能熟悉的语言 (R)。使用 sed(从长远来看绝对是合适的工具)需要安装 additional software 并熟悉 sed。

【讨论】:

【参考方案3】:

如果您需要有人使用文本编辑器手动标记这些记录,无论出于何种原因,您都应该使用split 将文件拆分为可管理的部分。

split -a4 -d -l100000 hugefile.txt part.

这会将文件分成几部分,每部分有 100000 行。文件名会是 part.0000、part.0001 等。然后,在所有文件都被编辑后,你可以将它们重新组合在一起 cat:

cat part.* > new_hugefile.txt

【讨论】:

【参考方案4】:

最简单的解决方案是使用面向流的编辑器,例如sed。您所需要的只是能够编写一个或多个正则表达式来识别所有(且仅)不良记录。由于您尚未提供有关如何识别不良记录的任何详细信息,因此这是唯一可能的答案。

【讨论】:

'sed' 是否允许我们指定行号并添加星号?行号算作“正则表达式”吗?

以上是关于如何编辑 300 GB 的文本文件(基因组数据)?的主要内容,如果未能解决你的问题,请参考以下文章

如何分析约 13GB 的数据?

如何从 300GB 文件中提取一列到另一个文件

支持*超过* 4GB 文件的最佳免费文本编辑器? [关闭]

如何使用 R 进行基因表达数据集分析

分块读取大文本文件

如何在Java中实现画图功能并在文本中显示坐标