在大文件中查找和替换同时替换另一个文件中存在的字段的最快方法

在大文件中查找和替换同时替换另一个文件中存在的字段的最快方法

我有两个文件。 File1 是一个包含 60 个字段的 csv:

111,Check1|^/h1/h2/h3,22062014184500,20,0.....
111,Check2|^/h43/h40/h9,22062014184500,4,.....
111,Check3|^/h1/h3/h4,22062014184500,0,0,.....

File2是一个映射文件:

OPUM04181,Check1|^/h1/h2/h3
OPUM04040235,Check3|^/h1/h3/h4
OPUM04051898,Check2|^/h43/h40/h9 

现在我要做的是在文件 1 的字段 2 中,我必须将该字段替换为匹配字段 2 的文件 1 的字段 1。示例:

现在我要做的是将 file1 的字段 2 替换为 file2 中与字段 2 匹配的行的字段 1。示例:

在文件1中:

111,Check1|^/h1/h2/h3,22062014184500,20,0.....

111,OPUM04181,22062014184500,20,0..... 

其中OPUM04181Check1|^/h1/h2/h3映射到 file2 中。

我的限制是 File1 和 file2 没有相同的值集;他们的计数不同。此外,两个文件的行数均为 300 万行。

这就是我正在尝试的:

  • 我运行了一个循环,获取 file1 中的字段 2
  • 我正在检查 file2 中是否存在该字段。
  • 如果存在,我将使用 file2 中的字段 1。
  • 我正在使用 替换 file1 中的 field2 sed s///g。但这需要花费大量时间。

我也无法对 File1 进行排序。

什么是更快的方法?

答案1

awk -F, -v OFS=, '
    NR==FNR {opu[$2]=$1; next} 
    $2 in opu {$2 = opu[$2]; print}
' file2 file1

这会将“映射”文件读入内存,然后替换 file1 的第二个字段。每个文件只处理一次。

输出转到标准输出,因此要“就地”替换文件,请执行以下操作

awk ... file2 file1 > tempfile && mv tempfile file1

相关内容