我有一个 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
作为数组中的键存在,如果是,我们更改值。