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]이 있기 때문에 항상 인용할 수는 없기 때문입니다 .

분명히 내가 원하는 것은 아닙니다. 두 파일 이름을 문자열로 추가하는 대신 숫자로 변환한 후 위 파일 이름의 합계를 얻습니다.

어떤 파일 이름이 특정 목록과 연관되어 있는지 명확하게 알려주는 출력 형식을 원하므로 다음과 같습니다.

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

아니면 다른 것입니까?

관련 정보