awk - printfの問題

awk - printfの問題

(編集:問題は解決しました。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

正規表現の使用はRSGNU拡張であるため、macOSでは動作しない可能性があります。そうでない場合は、以下を試してください。

$ awk -v RS='=' \
      -v OFS=';' \
      -F'[\n:]' \
     'NR%50==1 && $2{print $16,$3,$7}' file |
        sed -e 's/^ //' -e 's/; /;/g'

おすすめ記事