0

我在文件中有以下形式的数据:

    <http://purl.uniprot.org/here>   <http://purl.uniprot.org/here/unipot/purl>
    <http://purl.uniprot.org/uniprot/Q196Y7>        <http://purl.uniprot.org/core/annotation>

我想删除尖括号内的所有“ http://purl.uniprot.org ”。这样我得到的输出是

    <here>   <here/unipot/purl>
    <uniprot/Q196Y7>        <core/annotation>

我尝试使用 vi 的替换命令这样做。但事实证明它很慢,因为我的文件是 1TB。有没有更有效的方法来使用 linux/python 做同样的事情

我知道我可以使用 sed 但 sed 查找的模式并删除它们,而我想删除确切的内容

4

3 回答 3

1

正如 Radu Rădeanu 所说sed它是替换文件中字符串的好工具,因为它适用于流,而不是尝试将整个文件加载到内存中。

但是sed使用正则表达式,在你的情况下(1TB 的输入数据),这可能太慢了。Unix 工具通常可以处理任意大小的文件,而且效率惊人,但极端情况可能太多了。

如果您需要优化流程,这里有几点建议:

  1. 将大文件拆分为较小的文件。例如,如果这是一个日志文件,请每天创建一个文件,而不是将所有内容连接到一个大文件中。这样,您可以在每个每日文件中剥离字符串一次。

  2. 编写一个小的 C 程序来搜索确切的字符串(而不是使用正则表达式)。然后,您可以使用像Boyer-Moore这样的优化来获得巨大的性能提升。您还应该考虑使用内存映射 I/O。

于 2013-10-30T08:39:45.533 回答
1

这应该从命令行工作:

sed -i 's/http:\/\/purl.uniprot.org\///g' /path/to/filename

您可以先尝试不带-i参数查看控制台中的输出。

于 2013-10-30T08:23:55.523 回答
0

你说的“但事实证明是相当的”是什么意思?什么?如果是我,vi 是一个很好的工具。运行这个命令:

:s/http:\/\/purl.uniprot.org\//g
于 2013-10-30T08:29:44.443 回答