처음 세 개의 공통 열에 따라 레코드를 병합하고 마지막 열에 흔하지 않은 값을 쉼표로 구분하여 배치해야 합니다. 다음을 수행해야 한다는 요구 사항이 있습니다.
입력 파일 :
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