我有一个很大的文本文件(大约 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
(只有当您确信它正在做正确的事情时才添加)。