Linux
借助查找表替換 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 命令執行此操作?
您可以嘗試以下操作
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