Ich habe einige Ausgaben in Form von:
count id type
588 10 | 3
10 12 | 3
883 14 | 3
98 17 | 3
17 18 | 1
77598 18 | 3
10000 21 | 3
17892 2 | 3
20000 23 | 3
63 27 | 3
6 3 | 3
2446 35 | 3
14 4 | 3
15 4 | 1
253 4 | 2
19857 4 | 3
1000 5 | 3
...
Das ist ziemlich chaotisch und muss zu einer CSV aufgeräumt werden, damit ich es einem Projektmanager schenken kann.
Der Kern des Problems ist dieser: Ich brauche die Ausgabe von diesem zu sein:
id, sum_of_type_1, sum_of_type_2, sum_of_type_3
Ein Beispiel hierfür ist die ID "4":
14 4 | 3
15 4 | 1
253 4 | 2
19857 4 | 3
Dies sollte stattdessen sein:
4,15,253,19871
Leider bin ich ziemlich verrückt bei so etwas. Ich habe es geschafft, alle Zeilen zu bereinigen und in CSV zu übertragen, aber ich konnte die Zeilen nicht deduplizieren und gruppieren. Im Moment habe ich das:
awk 'BEGIN{OFS=",";} {split($line, part, " "); print part[1],part[2],part[4]}' | awk '{ gsub (" ", "", $0); print}'
Aber alles, was Sie tun müssen, ist, den Müll aufzuräumen und die Zeilen erneut auszudrucken.
Wie lassen sich die Zeilen am besten in die oben genannte Ausgabe einmassieren?
Antworten:
Eine Möglichkeit, dies zu tun, besteht darin, alles in einen Hash zu setzen.
edit: meine erste antwort hat die frage nicht richtig beantwortet
quelle
NF<4{$4="no_type";}
zu Beginn hinzufügenPerl zur Rettung:
Es enthält zwei Tabellen, eine Typentabelle und eine ID-Tabelle. Für jede ID wird die Summe pro Typ gespeichert.
quelle
Wenn GNU Datamash eine Option für Sie ist, dann
quelle
Python (und insbesondere die
pandas
Bibliothek eignen sich sehr gut für diese Art von ArbeitHiermit werden die CSV-Daten in a gelesen
pandas DataFrame
Dann gruppieren wir diese Daten nach
id
und nehmen die Summe der Spaltencount
Das
unstack
ändert seine Form , um die IDs in die Spalten zu verschieben, undfillna
füllt die leeren Felder mit NullenDies kehrt zurück
Da der Datenrahmen fehlende Daten enthält (leere ID-Typ-Kombinationen), wandelt pandas das
int
s in umfloat
(Einschränkung der internen Funktionsweise). Wenn Sie wissen, dass die Eingaben nur int sind, können Sie die vorletzte Zeile in änderndf_sum = df.groupby(('type', 'id'))['count'].sum().unstack('type').fillna(0).astype(int)
quelle
Sie können Perl verwenden, um die CSV-Datei zu durchlaufen und die Summe der entsprechenden Typen in einem Hash zu akkumulieren, während Sie unterwegs sind. Zeigen Sie am Ende die Informationen an, die für jede ID gesammelt wurden.
Datenstruktur
Dies hilft, den folgenden Code zu verstehen:
Perl
Ausgabe
quelle
Meiner Meinung nach nicht zu verschieden von anderen. Verwendet GNU awk mit Arrays von Arrays
Ausgänge
quelle
Mit diesem Code können Sie Werte basierend auf Ihrer ID-Spalte zusammenfassen.
Ich habe eine awk-Anweisung nach Ihrem Code hinzugefügt
Fahren Sie fort mit diesem ...
quelle