【问题标题】:Fast way to substitute string pairs in file在文件中替换字符串对的快速方法
【发布时间】:2016-11-14 06:35:18
【问题描述】:

我有一个包含 2 列的约 10,000 行的文件:

org_string1 \t replacement_string1
org_string2 \t replacement_string2

将所有这些 org_string 替换为另一个文本文件中对应的 replacement_string(在第二个文件中进行 10k 替换)的最佳方式(速度/便利性)是什么?

我打算将它们转换为 sed 替换命令,但不确定速度性能以及它是否会超过 linux 中的最大命令行限制。

假设:

  1. 所有 org_string 和 replacement_string 都是唯一的。
  2. org_string 是输入文件中的一个单词(由空格包围)。

【问题讨论】:

  • 所以你想在第二个文件中做 10k 个不同的替换?根据我的经验,sed 会变得非常慢,即使你给它一个包含 10k s/org_string1/replacement_string1/ 行的文件。我没有尝试使用 10k 正则表达式和替换字典的 Perl 或 Python。
  • 我猜在 perl 中转换/替换不会有问题,因为 perl 会在几毫秒内完成。
  • 单次替换会很快。但是根据 10k 模式检查每一行将总结出来。
  • 快速替换超大文件中的文本 [StackExchange] unix.stackexchange.com/questions/255373/…
  • @ssr1012 您链接到的问题不是关于可能对文件的每一行进行 10k 不同的替换。大量替换是这里的问题。

标签: python perl sed substitution


【解决方案1】:

这是一种使用 Perl 的技术,可能会有所帮助:

my %map = (
    'the'   => 'a',
    'fox'   => 'frog',
    'jumps' => 'somersaults'
);

my $line = "the quick bown fox jumps over the lazy dog";

$line =~ s{\b(\w+)\b}{$map{$1} // $1}eg;

say $line;

此示例使用硬编码的哈希映射 orig_strings 到 replacement_strings - 在您的情况下,您将通过读取映射对文件来填充此映射哈希。

然后正则表达式使用\b(\w+)\b捕获行中的每个单词并通过$1传递给替换端。因为指定了/e 选项,所以替换的右侧被视为Perl 表达式,并且计算表达式的结果是替换文本。 $map{$1} 使用原始单词作为映射哈希的键来查找替换文本。 // $1 部分表示如果哈希查找返回 undef(即这个词没有替代品),那么只需使用原始文本。

\w+ 部分将匹配一串单词或数字或下划线字符。您可能只需要字母字符,可能还需要撇号和连字符。为此,请使用[a-zA-Z'-]+ 而不是\w+

这应该非常快,因为每一行只运行一个正则表达式,并且每一行中的每个单词只有一个哈希查找。

【讨论】:

  • 这比进行多次替换要快得多。谢谢。
猜你喜欢
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-29
  • 2017-07-18
  • 2010-10-29
  • 2013-09-21
相关资源
最近更新 更多