我有一个包含2列的〜10,000行的文件:
org_string1 \t replacement_string1
org_string2 \t replacement_string2
将所有这些org_string替换为另一个文本文件中的相应replacement_string(在第二个文件中进行10k替换)的最佳方式(速度/便利性)是什么?
我打算将它们转换为sed替换命令但不确定速度性能以及它是否会超过linux中的max命令行限制。
假设:
答案 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+
。
这应该非常快,因为每行只运行一个正则表达式,每行中每个单词只有一个哈希查找。