(編集:問題は解決しました。MacでWindows生成ファイルを使用していましたが、問題は行末でした。Studio Codeでファイルを開き、正しい行末を設定すると問題は解決しました。)
ProduKey
処理したいファイルを作成しました。awk
。
ProduKey は次の出力を生成します。
==================================================
Product Name : Microsoft Office Professional 2013
Product ID : 00000-00000-00000-00000
Product Key : 00000-00000-00000-00000-00000
Installation Folder : C:\Program Files\Microsoft Office\Office15\
Service Pack :
Build Number :
Computer Name : PC-000-0
Modified Time : 06.12.2018 14:03:44
==================================================
==================================================
Product Name : Windows 10 Pro
Product ID : 00000-00000-00000-00000
Product Key : 00000-00000-00000-00000-00000
Installation Folder : C:\Windows
Service Pack :
Build Number : 17763
Computer Name : PC-000-0
Modified Time : 18.07.2019 09:50:37
==================================================
後で、キー、コンピュータ名、および製品名をデータベースに保存するためのcsvファイルを生成したいと思います。
したがって、可能なCSVは次のようになります。
PC-000-0;Microsoft Office Professional 2013;00000-00000-00000-00000-00000
これまでの私のアプローチは次のとおりです。
BEGIN {
RS="\n\n";
FS="\n";
}
{
if ($1 ~ /Product Name/) {
split($1,productArray,":")
product = productArray[2]
}
if ($1 ~ /Product Key/) {
split($1,keyArray,":")
key = keyArray[2]
}
if ($1 ~ /Computer Name/ ) {
split($1,computerArray,":")
computer = computerArray[2]
#print product
#print key
#print computer
printf("\n")
printf("%s ; %s ; %s \n", computer, product, key)
}
}
私の問題は、文字列を連結できないことです。または、印刷しようとすると文字列が上書きされますか?私はこれについて数時間を費やしており、どんな助けやアドバイスにも本当に感謝します。
私の目標を達成するためのよりエレガントな方法がある場合は、いつでもお知らせください。
私はこれをMac awk
(awkバージョン20070501)で使用していますが、Linuxボックスも持っています。
よろしくお願いします。
ベストアンサー1
ここでは、awkのレコード区切り記号()を使用できますRS
。これを==================================================
or={50}
に設定することは同じですが、単一の製品に関連する各値のセットを単一の「行」として扱うことができる正規表現です。次に、出力フィールド区切り記号(OFS
)をに設定;
し、入力フィールド区切り記号(FS
または-F
オプション)を\n
(newline)または(newline)に設定すると、:
次のようないくつかのトリックを実行できます(GNU awkを使用)。
$ awk RS='={50}' \
-v OFS=';' \
-F'[\n:]' \
'NR%2==0{print $16,$3,$7}' file
PC-000-0; Microsoft Office Professional 2013; 00000-00000-00000-00000-00000
PC-000-0; Windows 10 Pro; 00000-00000-00000-00000-00000
=============================================
各項目には上(50)と下に1つずつあるので、=
毎秒「行」だけを読み取ろうとします。それがNR%2==0
小切手の目的です。
各行の先頭とフィールドの間に余分なスペースがあります。問題がある場合は、以下を使用して削除できますsed
。
$ awk -v RS='={50}' \
-v OFS=';' \
-F '[\n:]' \
'NR%2==0{print $16,$3,$7}' file |
sed -e 's/^ //' -e 's/; /;/g'
PC-000-0;Microsoft Office Professional 2013;00000-00000-00000-00000-00000
PC-000-0;Windows 10 Pro;00000-00000-00000-00000-00000
正規表現の使用はRS
GNU拡張であるため、macOSでは動作しない可能性があります。そうでない場合は、以下を試してください。
$ awk -v RS='=' \
-v OFS=';' \
-F'[\n:]' \
'NR%50==1 && $2{print $16,$3,$7}' file |
sed -e 's/^ //' -e 's/; /;/g'