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