使用 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

...whilea['newsletterOptin']将包含20200211204354作为值

因为我不能总是引用,$2因为有时我将 [pending] 而其他时间 [2020-03-24 18:03:42] 作为第一个字段。

显然不是我想要的,不是将两个文件名作为字符串附加,而是将上述文件名转换为数字后得到它们的总和。

我希望输出格式能够清晰地告诉我哪些文件名与特定列表相关,所以像这样:

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

或者是其他东西?

相关内容