我有两个文件。 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.....
其中OPUM04181
↔Check1|^/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