Linux

借助查找表替換 csv 文件的第 n 列

  • September 16, 2015

我有一個 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 命令執行此操作?

您可以嘗試以下操作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是一種在讀取第一個文件 () 時為真的模式,我們使用來自 column的鍵和來自 column 的值b.csv創建數組。在最後一節中,我們讀取第二個文件並檢查列是否作為數組中的鍵存在,如果是,我們更改值。x``$1``$2``$7

引用自:https://unix.stackexchange.com/questions/230008