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 recs
Array wird durch die Verkettung der ersten drei Felder indiziert. (Arrays in awk
werden durch Zeichenfolgen indiziert.) Jedes Element des Arrays enthält die sogenannten „ungewöhnlichen“ Felder, die durch Kommas getrennt sind.
Für jede Eingabezeile: key
Enthält die ersten drei Felder. Die for
Schleife durchläuft die restlichen Felder. Die if
Anweisung ü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 ( END
Tag): 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