在文件

时间:2016-07-12 06:45:18

标签: python perl sed substitution

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

org_string1 \t replacement_string1
org_string2 \t replacement_string2

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

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

假设:

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

1 个答案:

答案 0 :(得分:3)

这是一种使用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+

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