공통 열을 기준으로 레코드를 병합하고 마지막 열에 흔하지 않은 값을 쉼표로 구분하여 지정

공통 열을 기준으로 레코드를 병합하고 마지막 열에 흔하지 않은 값을 쉼표로 구분하여 지정

처음 세 개의 공통 열을 기준으로 레코드를 병합하고 마지막 열에 흔하지 않은 값을 쉼표로 구분하여 배치해야 합니다. 나는 다음을 수행해야한다는 요구 사항이 있습니다 -

입력 파일:

HWF CommonDomain  javatools       AdminServer
ABC CommonDomain  resourcebundle  AdminServer
HWF CommonDomain  stringeditor    AdminServer
ABC CommonDomain  resourcebundle  HelpPortalServer_1
HWF CommonDomain  stringeditor    HelpPortalServer_1 
HWF CommonDomain  javatools       HelpPortalServer_1

예상 출력:

ABC CommonDomain resourcebundle   AdminServer,HelpPortalServer_1
HWF CommonDomain javatools       AdminServer,IHelpPortalServer_1 
HWF CommonDomain stringeditor   AdminServer,HelpPortalServer_1 

답변1

질문을 업데이트해주셔서 감사합니다. 100% 개선되었습니다.

소위 "비일반적인" 값에 포함된 값이 출력에서 ​​반복되어야 하는지에 대해 언급하지 않으셨는데, 제 생각에는 그렇지 않습니다.

이 스크립트는 모든 버전에서 작동해야 합니다 awk. GNU 확장이 없습니다.테스트를 위해 gawk --traditional더 많은 조건을 테스트하기 위해 추가 입력 데이터를 추가했습니다. 이는 입력의 중복 레코드를 처리합니다. 내가 예상하는 가장 큰 문제는 입력의 쉼표입니다. 스크립트는 지정된 대로 작동하지만 출력 파일은 빈 필드가 있는 것처럼 보일 수 있습니다.

코드 설명:

배열 recs은 처음 세 필드를 연결하여 인덱싱됩니다. (배열은 awk문자열로 인덱싱됩니다.) 배열의 각 요소에는 쉼표로 구분된 "일반적이지 않은" 필드가 포함되어 있습니다.

각 입력 행에 대해: key처음 세 개의 필드를 포함합니다. 루프는 for나머지 필드를 단계별로 진행합니다. 이 if문은 해당 키의 필드가 이미 저장되어 있지 않은지 확인합니다. 그렇지 않은 경우 해당 필드는 레코드 끝에 추가되며 적절하게 공백이나 쉼표가 앞에 추가됩니다.

입력 끝( END레이블): 키를 통해 recs 배열로 이동하여 키와 키에 포함된 데이터를 인쇄합니다.

#!/bin/sh

awk '
    {
        key = $1 " " $2 " " $3;
        for (i = 4; i <= NF; i++) {
            if (recs[key] !~ "(^|,)"$i"(,|$)") {
                recs[key] = recs[key] (recs[key] ? "," : "") $i
            }
        }
    }
    END {
        for (key in recs) {
            print key " " recs[key]
        }
    }
' <<EOF
HWF CommonDomain  javatools       AdminServer
HWF CommonDomain  javatools       AdminServer2
HWF CommonDomain  javatools       3AdminServer
HWF CommonDomain  javatools       AdminServer
HWF CommonDomain  javatools       AdminServer
ABC CommonDomain  resourcebundle  AdminServer
ABC CommonDomain  resourcebundle  AdminServer
ABC CommonDomain  resourcebundle  AdminServer2
ABC CommonDomain  resourcebundle  3AdminServer
HWF CommonDomain  stringeditor    AdminServer2
HWF CommonDomain  stringeditor    3AdminServer
ABC CommonDomain  resourcebundle  HelpPortalServer
HWF CommonDomain  stringeditor    HelpPortalServer_1 
HWF CommonDomain  javatools       HelpPortalServer_1
HWF CommonDomain  javatools       HelpPortalServer_2
HWF CommonDomain  javatools       3_HelpPortalServer_2
HWF CommonDomain  stringeditor    HelpPortalServer 
HWF CommonDomain  javatools       HelpPortalServer_1
HWF CommonDomain  javatools       HelpPortalServer_2
HWF CommonDomain  javatools       3_HelpPortalServer
EOF

산출:

HWF CommonDomain stringeditor AdminServer,HelpPortalServer_1
HWF CommonDomain javatools AdminServer,AdminServer2,3AdminServer,HelpPortalServer_1,HelpPortalServer_2,3_HelpPortalServer_2
ABC CommonDomain resourcebundle AdminServer,HelpPortalServer_1

관련 정보