我有一个 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
或者是其他东西?