2016-07-12 65 views
1

快捷的方式我有含2列〜1萬行的文件:替換字符串對文件

org_string1 \t replacement_string1 
org_string2 \t replacement_string2 

什麼是替代的最佳方式(速度/便利),所有與各自replacement_string這些org_string另一個文本文件(在第二個文件中做10k替換)?

我打算將它們轉換爲sed替換命令,但不確定速度性能以及它是否會超過linux中的最大命令行限制。

假設:

  1. 所有org_string和replacement_string是唯一的。
  2. org_string是輸入文件中的單個單詞(由空格包圍)。
+2

所以你想在第二個文件中做10K不同的替換?根據我的經驗,'sed'會變得很慢,即使你給它一個10k'/ org_string1/replacement_string1 /'行的文件。我沒有嘗試使用10k的正則表達式和替換的Perl或Python。 –

+0

我想這不會是perl中的轉換/替換問題,因爲perl會以毫秒爲單位執行此操作。 – ssr1012

+0

單個替換將會很快。但檢查每條線對10k模式將總結。 –

回答

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+

這應該是非常快的,因爲每行只有一個正則表達式運行,每行只有一個散列查找。

+0

這比做多次替換要快得多。謝謝。 – Ken