我有一個非常大的文本檔案(超過 4GB)。我在這個巨大的檔案(pattern.txt)中有多個條目要搜索和替換。
因此,我創建了一個名為 leo.sed 的檔案并使用了 sed -f 命令。
leo.sed:這個檔案包含大約 500 個條目。例子:
s/"PET10"/"PETfdfd0"/g
s/"PET11"/"PET123wef"/g
s/"PET12"/"TETPrandom"/g
我正在使用以下 sed 命令,但它非常慢。
sed -f leo.sed pattern.text | sed -f leo1.sed > pattern_after_leo_leo1_sed.txt
perl one-liner 有什么更快的方法嗎?
uj5u.com熱心網友回復:
如果只需要執行一次,如果它“足夠快”,則將其設定為運行并執行其他操作。你的時間比電腦的時間更寶貴。
如果您受到磁盤速度的限制,那么您無能為力。
如果不是這樣,同樣的技術,在每行上做 500 個模式,在 Perl 中不太可能更快。相反,您需要改進演算法。需要減少正則運算式的數量。這可以通過找到一些共同的模式來完成。
例如,如果它是引號中的所有內容,我們可以使用一個匹配引號中任何內容的正則運算式。然后替換值來自哈希。我們在一個塊中設定散列,BEGIN以便在掃描檔案之前只執行一次。我們可以使用babycart 運算子在字串中插入運算式。
perl -i.orig -pe 'BEGIN { %replacements = (PET10 => "PETfdfd0", PET11 => "PET123wef"); } s{"([^"] )"}{"@{[$replacements{$1} || $1]}"}g' test.txt
現在每行只需要掃描一次。這可能會也可能不會更快。
uj5u.com熱心網友回復:
這是 Schwern 發布的代碼的更快版本:
perl -i.orig -pe'
BEGIN {
%replacements = map qq{"$_"}, (
PET10 => "PETfdfd0",
PET11 => "PET123wef",
);
}
s{"[^"] "}{ $replacements{$&} // $& }eg
' test.txt
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/470779.html
上一篇:Perl-推送元素
下一篇:如何檢查客戶端是否已斷開連接?
