Obrigado por atualizar a pergunta, 100% melhor.
Você não mencionou se os valores em que você chama de valores "incomuns" devem ser duplicados na saída, eu não assumo.
Este script deve ser executado em todas as versões de awk
. Nenhuma extensão GNU, testada com gawk --traditional
. Eu adicionei dados de entrada extras para testar mais condições. Isso lida com registros duplicados na entrada. O maior problema que eu prevejo seria vírgulas na entrada, o script funcionará como especificado, mas o arquivo de saída pode parecer ter campos vazios, etc.
Descrição do código:
A matriz recs
é indexada pela concatenação dos três primeiros campos. (Matrizes em awk
são indexadas por strings.) Cada elemento da matriz contém o que você chama de campos "incomuns" separados por vírgulas.
Para cada linha de entrada: key
contém os três primeiros campos. O loop for
percorre os campos restantes. A instrução if
verifica se o campo ainda não foi armazenado para essa chave. Caso contrário, o campo será adicionado ao final do registro, precedido por um espaço ou vírgula, conforme apropriado.
No final da entrada ( END
tag): percorra as chaves até a matriz recs, imprimindo a chave e os dados nela contidos.
#!/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
Saída:
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