Combine registros según columnas comunes y especifique los valores que no son comunes en la última columna separados por comas

Combine registros según columnas comunes y especifique los valores que no son comunes en la última columna separados por comas

Necesito fusionar registros dependiendo de las tres primeras columnas comunes y colocar los valores que no son comunes en la última columna separados por comas. Tengo el requisito de hacer lo siguiente:

Fichero de entrada :

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

Rendimiento esperado :

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

Respuesta1

Gracias por actualizar la pregunta, 100% mejor.

No mencionaste si los valores en lo que llamas valores "poco comunes" deberían duplicarse en la salida, supongo que no.

Este script debería ejecutarse en todas las versiones de awk. Sin extensiones GNU,probado con gawk --traditional. Agregué datos de entrada adicionales para probar más condiciones. Esto maneja registros duplicados en la entrada. El mayor problema que preveo serían las comas en la entrada, el script funcionará según lo especificado, pero podría parecer que el archivo de salida tiene campos vacíos, etc.

Descripción del código:

La recsmatriz está indexada por la concatenación de los primeros tres campos. (Las matrices awkestán indexadas por cadenas). Cada elemento de la matriz contiene lo que usted llama campos "poco comunes" separados por comas.

Para cada línea de entrada: keycontiene los primeros tres campos. El forbucle recorre los campos restantes. La ifdeclaración verifica que el campo aún no se haya almacenado para esta clave. De lo contrario, el campo se agrega al final del registro, precedido de un espacio o una coma, según corresponda.

Al final de la entrada ( ENDetiqueta): recorra las claves hasta la matriz de recs, imprimiendo la clave y los datos contenidos en ella.

#!/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

Producción:

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

información relacionada