通过查找表替换 csv 文件的第 n 列

通过查找表替换 csv 文件的第 n 列

我有一个 csv 文件 (a.csv) 如下(有数千行):

NMS_NE,,,,,,,,,,,,,,,,,,,,,,,
D,NE Name,IP Address,Site Name,Product UPEI,Product Name,Product Model,NE Status,Serial Number,SW Major Release,SW Minor Release,SW Patch Release,Manufacturing Date,Installation Date ,Into Service Date ,Licensed System ID,License Key,Decommissioning Date,Description,,,,,
X,a155,1.1.1.155,,,,audi,,,4.8,abc48.677,,,,,,,,,,,,,
X,b145,1.1.1.145,,,,bmw,,,4.3,abc43.489,,,,,,,,,,,,,
X,c198,1.1.1.198,,,,vw,,,4.4,abc44.779,,,,,,,,,,,,,
...

我有一个查找 csv 表 (b.csv) 如下(有数百行):

model,product name
bmw,1.16
audi,a3
vw,golf
...

我想要做的是:从 a.csv 中获取“产品型号”(第 7 列)的值,并在 b.csv 文件中检查该值。如果“产品型号”值(来自 a.csv)等于“型号”值(来自 b.csv),则根据 b.csv 中匹配的“型号”值查找“产品名称”并替换“产品” a.csv 的“型号”与 b.csv 的相关“产品名称”。所以输出文件应该是:

NMS_NE,,,,,,,,,,,,,,,,,,,,,,,
D,NE Name,IP Address,Site Name,Product UPEI,Product Name,Product Model,NE Status,Serial Number,SW Major Release,SW Minor Release,SW Patch Release,Manufacturing Date,Installation Date ,Into Service Date ,Licensed System ID,License Key,Decommissioning Date,Description,,,,,
X,a155,1.1.1.155,,,,a3,,,4.8,abc48.677,,,,,,,,,,,,,
X,b145,1.1.1.145,,,,1.16,,,4.3,abc43.489,,,,,,,,,,,,,
X,c198,1.1.1.198,,,,golf,,,4.4,abc44.779,,,,,,,,,,,,,
...

我如何通过简单的 awk 命令来做到这一点?

答案1

您可以尝试以下操作awk

awk 'BEGIN { FS = OFS = ","; } FNR == NR { x[$1] = $2; next; } { if ($7 in x) { $7 = x[$7]; } } 1' b.csv a.csv

BEGIN部分中,我们将字段分隔符FS和输出字段分隔符设置OFS,FNR == NR是一种模式,在读取第一个文件 ( ) 时为真b.csv,我们x使用列中的键$1和列中的值创建数组$2。在上一节中,我们读取第二个文件并检查列是否$7作为数组中的键存在,如果是,我们更改值。

相关内容