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 recs
matriz está indexada por la concatenación de los primeros tres campos. (Las matrices awk
está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: key
contiene los primeros tres campos. El for
bucle recorre los campos restantes. La if
declaració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 ( END
etiqueta): 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