Awkを使用してヘッダー行を一致させて、次のフィールドをグループ化します。

Awkを使用してヘッダー行を一致させて、次のフィールドをグループ化します。

cliツールの出力があり、次のリストが提供されます。

Listing accountBrand
  [2020-03-24 18:03:42] 20200211204415-create-accountBrand.js : Initial creation of accountBrand
  [2020-03-24 18:03:45] 20200323215802-example-entry.js : <Put your description here>
Listing baseBrand
  [pending]             20200211202306-create-baseBrand.js : Initial creation of base brand
Listing loginRegistrationInit
  [2020-03-24 14:03:41] 20200211204431-create-loginRegistrationInit.js : Initial creation of login registration init
Listing newsletterOptin
  [pending]             20200211204354-create-newletter-optin.js : Initial creation of newsletter optin
Listing test
  [pending]             testMigration.js : <No Description>

私は、単語の後に続く単語にキーが設定された連想配列が必要であり、ファイルListing名は、各単語の要素が個別に終了します。

したがって、デフォルトでは、上記のリストはa次の内容を含む配列を生成します。

a['accountBrand'] = ['20200211204415-create-accountBrand.js', '20200323215802-example-entry.js']
a['loginRegistrationInit'] = ['20200211204431-create-loginRegistrationInit.js']
...

私は次のことを思い出しました。

cat list | awk '/Listing/ {k=$2; next;}; {a[k]+=$2} END {print a["accountBrand"]}'

しかし、その結果、私は次のようになります。

36

...whileは値としてa['newsletterOptin']含まれています。20200211204354

$2時には最初のフィールドとして[pending]があり、他の時間に[2020-03-24 18:03:42]があるため、常に引用できないためです。

明らかに私が望むものではありません。 2つのファイル名を文字列として追加するのではなく、数値に変換して上記のファイル名の合計を取得します。

どのファイル名が特定のリストに関連付けられているかを明確に伝える出力形式が必要なので、

accountBrand filename1, filename2
newsletterOptin filename1
baseBrand filename1, filename2, filename3
...

ベストアンサー1

これで助けを求めたの?

$ cat tst.awk
/^ / {
    sub(/.*]/,"")
    fnames[$1]
    next
}
{ if (NR>1) prt(); key = $2 }
END { prt() }

function prt() {
    printf "%s", key
    for (fname in fnames) {
        printf " %s", fname
    }
    print ""
    delete fnames
}

$ awk -f tst.awk file
accountBrand 20200211204415-create-accountBrand.js 20200323215802-example-entry.js
baseBrand 20200211202306-create-baseBrand.js
loginRegistrationInit 20200211204431-create-loginRegistrationInit.js
newsletterOptin 20200211204354-create-newletter-optin.js
test testMigration.js

または具体的には、次の実装を実行します。

$ cat tst.awk
/^ / {
    sub(/.*]/,"")
    fnames[key] = (key in fnames ? fnames[key] OFS : "") $1
    next
}
{ key = $2 }
END {
    for (key in fnames) {
        print key, fnames[key]
    }
}

$ awk -f tst.awk file
loginRegistrationInit 20200211204431-create-loginRegistrationInit.js
baseBrand 20200211202306-create-baseBrand.js
accountBrand 20200211204415-create-accountBrand.js 20200323215802-example-entry.js
newsletterOptin 20200211204354-create-newletter-optin.js
test testMigration.js

それとも別のものですか?

おすすめ記事