根据 CSV 文件中的字段替换大文本文件中的字符串

根据 CSV 文件中的字段替换大文本文件中的字符串

我有一个很大的文本文件(大约 2GB)。我有一个 csv 文件,其中包含以下字段:

rowID,pattern,other
1,abc_1z1,90
2,abc_1z2,90
3,abc_1z10,80
4,abc_3p1,77
...

我的兴趣是:按如下方式替换大文件的内容。每当大文件中的字符串与 CSV(第二个字段)中的“模式”匹配时,它将用相应的“rowID”(第一个字段)替换该字符串。

这是我尝试使用 sed 的方法,它非常慢(也是由于文件的就地替换)。但是,有没有更快的解决方案呢?

while read f1 f2 f3; 
do 
    sed -i "s/$f2/$f1/g" bigfile; 
done < map.csv

请注意,map.csv 包含超过 500000 行。

答案1

请注意, sed 替换正则表达式而不是字符串 - 我假设这对于您的用例来说不是问题,因为您当前的解决方案使用它。

一种方法是预处理map.csv成一系列表达式以传递给以下函数的单次调用sed -f

awk -F, 'NR>1 {printf "s/%s/%s/g\n", $2, $1}' map.csv | sed -f - bigfile

-i(只有当您确信它正在做正确的事情时才添加)。

相关内容