替换文件中字符串对的快速方法
Fast way to substitute string pairs in file
我有一个包含 2 列的约 10,000 行的文件:
org_string1 \t replacement_string1
org_string2 \t replacement_string2
将所有这些 org_string 替换为另一个文本文件中相应的 replacement_string 的最佳方法 (speed/convenience) 是什么(在第二个文件中进行 10k 替换)?
我打算将它们转换为 sed 替换命令,但不确定速度性能以及它是否会超过 linux 中的最大命令行限制。
假设:
- 所有 org_string 和 replacement_string 都是唯一的。
- org_string 是输入文件中的单个单词(被 space 包围)。
这里有一个使用 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{} // }eg;
say $line;
此示例使用硬编码哈希映射 orig_strings 到 replacement_strings - 在您的情况下,您将通过读取映射对文件来填充此映射哈希。
然后正则表达式使用\b(\w+)\b
捕获行中的每个单词并通过</code>传递给替换端。因为指定了 <code>/e
选项,所以替换的右侧被视为 Perl 表达式,表达式的计算结果是替换文本。 $map{}
使用原始单词作为映射哈希的键来查找替换文本。 //
部分是说如果哈希查找 returns undef
(即没有替代这个词)那么只使用原始文本。
\w+
部分将匹配一串单词或数字或下划线字符。您可能只需要字母字符,可能还需要撇号和连字符。为此,请使用 [a-zA-Z'-]+
而不是 \w+
。
这应该非常快,因为每一行只有一个正则表达式 运行,并且每一行中的每个单词只有一个哈希查找。
我有一个包含 2 列的约 10,000 行的文件:
org_string1 \t replacement_string1
org_string2 \t replacement_string2
将所有这些 org_string 替换为另一个文本文件中相应的 replacement_string 的最佳方法 (speed/convenience) 是什么(在第二个文件中进行 10k 替换)?
我打算将它们转换为 sed 替换命令,但不确定速度性能以及它是否会超过 linux 中的最大命令行限制。
假设:
- 所有 org_string 和 replacement_string 都是唯一的。
- org_string 是输入文件中的单个单词(被 space 包围)。
这里有一个使用 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{} // }eg;
say $line;
此示例使用硬编码哈希映射 orig_strings 到 replacement_strings - 在您的情况下,您将通过读取映射对文件来填充此映射哈希。
然后正则表达式使用\b(\w+)\b
捕获行中的每个单词并通过</code>传递给替换端。因为指定了 <code>/e
选项,所以替换的右侧被视为 Perl 表达式,表达式的计算结果是替换文本。 $map{}
使用原始单词作为映射哈希的键来查找替换文本。 //
部分是说如果哈希查找 returns undef
(即没有替代这个词)那么只使用原始文本。
\w+
部分将匹配一串单词或数字或下划线字符。您可能只需要字母字符,可能还需要撇号和连字符。为此,请使用 [a-zA-Z'-]+
而不是 \w+
。
这应该非常快,因为每一行只有一个正则表达式 运行,并且每一行中的每个单词只有一个哈希查找。