List.csv
次の形式のCSVファイルがあります。
Location,IP Address,Host Name,Domain,Domain Name, User Name,Manufacturer,Model,System Type, Serial Number, Operating System,RAM (GB),Processor Type,Processor Frequency
H1,xx.xx.xx.xx,PC1,domain.com,DOMAIN,User1,LENOVO,4089AZ8,X86-based PC,L90RA96,Microsoft Windows 7 Professional ,2,Pentium(R) Dual-Core CPU E5800,3.20GHz
H3,xx.xx.xx.xx,PC2,domain.com,DOMAIN,User2,LENOVO,4089AZ8,X86-based PC,L906W3P,Microsoft Windows 7 Professional ,2,Pentium(R) Dual-Core CPU E5800,3.20GHz
H2,xx.xx.xx.xx,PC3,domain.com,DOMAIN,User3,LENOVO,4089A76,X86-based PC,L929410,Microsoft Windows 7 Professional ,2,Pentium(R) Dual-Core CPU E5400,2.70GHz
H2,xx.xx.xx.xx,PC4,domain.com,DOMAIN,User4,Hewlett-Packard,Z800,x64-based PC,SGH007QT16,Microsoft Windows 7 Professional ,12,Intel(R) Xeon(R) CPU W5590,3.33GHz
列を見ると、MODEL
モデル名を説明できない値がいくつか含まれていることがわかります。model-list.csv
この値とそのモデル名を含む別のファイルを作成しました。それは次のとおりです。
Manufacturer,Value,Model Name
Lenovo, 4089AZ8, ThinkCentre
Lenovo, 4089A76, ThinkCentre
HP, Z800, HP Z800 Workstation
ファイル内のList.csv
値をmodel-list.csv
。List.csv
model-list.csv
#!/bin/bash
file1="List.csv"
file2="model-list.csv"
outfile="List_out.csv"
stagingfile="List-staging.csv"
rm -f "$outfile" "$stagingfile"
while read line
do
ModelNo=`echo "$line"|awk -F',' '{print $2}'`
ModelName=`echo "$line"|awk -F',' '{print $3}'`
cat "$file1"|grep ",$ModelNo," > "$stagingfile"
if [ -s "$stagingfile" ]
then
while read line1
do
NewLine=`echo "$line1"|sed "s/,${ModelNo},/,${ModelName},/g"`
echo "$NewLine" >> "$outfile"
done < "$stagingfile"
rm -f "$stagingfile"
fi
done < "$file2"
上記のスクリプトを実行した"$outfile"
ときList.csv
。
スクリプトに問題がありますか?
ベストアンサー1
次の目的で使用できますawk
。
awk -F',|, ' 'NR==FNR{a[$2]=$3} NR>FNR{$8=a[$8];print}' OFS=',' "$file2" "$file1"
これはmodel-list.csvを読み取り、すべてのモデルとその説明を文字列インデックス配列(たとえばa["Z800"] == "HP Z800 Workstation"
)に格納します。次に、リストデータを読み込み、各モデルを配列の説明文字列に置き換えます。
説明する:
-F',|, '
- 正規表現パターンを使用してフィールド区切り記号を設定します。この場合、フィールド区切り文字は単一のコンマまたは単一のコンマと単一のスペースになります。NR==FNR{a[$2]=$3}
- NR は、プログラムの開始以降に読み込まれた行の総数を追跡する awk 内部変数です。 FNRは似ていますが、行数を記録します。現在のファイル読んだこと。NR==FNR
「これが最初に読み取るファイルの場合」を意味するawkイディオムの場合も同様です。a[$2]=$3
フィールド3の値を配列に格納し、a
文字列インデックスをフィールド2の値に設定します。NR>FNR{$8=a[$8];print}'
- 以前と似ていますが、今回は最初に読み取ったファイルではなく、ファイルにのみ機能します。各行について、フィールド 8 の値をインデックスとして使用して配列の値を検索し、フィールド 8 を配列値に再割り当てします。最後に、行全体が印刷されます。OFS=',' "$file2" "$file1"
- 出力フィールド区切り文字をコンマ(デフォルトは空白)に設定し、指定された順序で2つのファイルを読み込みます。