次の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
します。前のセクションでは、2番目のファイルを読み、その列が配列のキーとして存在することを確認し、その場合は値を変更しました。x
$1
$2
$7