从大文件中删除确切的字符串?

时间:2013-10-30 08:13:21

标签: python linux ubuntu

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

    <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的replace命令这样做。但事实证明,因为我的文件是1TB,所以速度很慢。有没有更有效的方法来使用linux / python

来做同样的事情

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

3 个答案:

答案 0 :(得分:1)

这应该来自命令行:

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

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

答案 1 :(得分:1)

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

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

如果您需要优化流程,请参考以下几点:

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

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

答案 2 :(得分:0)

你是什么意思“但事实证明它非常”?什么呢? 如果是我,vi只是一个非常好的工具。运行此命令:

:s/http:\/\/purl.uniprot.org\//g