Datensätze abhängig von gemeinsamen Spalten zusammenführen und die Werte, die in der letzten Spalte nicht vorkommen, durch Kommas getrennt angeben

Datensätze abhängig von gemeinsamen Spalten zusammenführen und die Werte, die in der letzten Spalte nicht vorkommen, durch Kommas getrennt angeben

Ich muss Datensätze abhängig von den ersten drei gemeinsamen Spalten zusammenführen und die Werte, die nicht in der letzten Spalte vorkommen, durch Kommas getrennt platzieren. Ich muss Folgendes tun:

Eingabedatei :

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

Erwartete Ausgabe :

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

Antwort1

Danke für die Aktualisierung der Frage, 100 % besser.

Sie haben nicht erwähnt, ob die Werte in den von Ihnen als „ungewöhnlich“ bezeichneten Werten in der Ausgabe dupliziert werden sollten. Ich gehe davon aus, dass dies nicht der Fall ist.

Dieses Skript sollte unter allen Versionen von ausgeführt werden awk. Keine GNU-Erweiterungen,getestet mit gawk --traditional. Ich habe zusätzliche Eingabedaten hinzugefügt, um weitere Bedingungen zu testen. Dies behandelt doppelte Datensätze in der Eingabe. Das größte Problem, das ich vorhersehe, wären Kommas in der Eingabe. Das Skript funktioniert wie angegeben, aber die Ausgabedatei könnte scheinbar leere Felder usw. enthalten.

Beschreibung des Codes:

Das recsArray wird durch die Verkettung der ersten drei Felder indiziert. (Arrays in awkwerden durch Zeichenfolgen indiziert.) Jedes Element des Arrays enthält die sogenannten „ungewöhnlichen“ Felder, die durch Kommas getrennt sind.

Für jede Eingabezeile: keyEnthält die ersten drei Felder. Die forSchleife durchläuft die restlichen Felder. Die ifAnweisung überprüft, ob das Feld für diesen Schlüssel noch nicht gespeichert wurde. Wenn nicht, wird das Feld am Ende des Datensatzes hinzugefügt und je nach Bedarf mit einem Leerzeichen oder Komma vorangestellt.

Am Ende der Eingabe ( ENDTag): Gehen Sie die Schlüssel zum recs-Array durch und drucken Sie den Schlüssel und die darin enthaltenen Daten.

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

Ausgabe:

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

verwandte Informationen