공통 열에 따라 레코드를 병합하고 마지막 열에 흔하지 않은 값을 쉼표로 구분하여 지정합니다.

공통 열에 따라 레코드를 병합하고 마지막 열에 흔하지 않은 값을 쉼표로 구분하여 지정합니다.

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

입력 파일 :

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

관련 정보