Mam pewne dane wyjściowe w postaci:
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
...
Co jest dość niechlujne i musi zostać wyczyszczone do pliku CSV, abym mógł przekazać go kierownikowi projektu dla nich arkusz kalkulacyjny.
Rdzeń problemu jest następujący: potrzebuję tego:
id, suma_typu_1, suma_typu_2, suma_typu_3
Przykładem tego jest identyfikator „4”:
14 4 | 3
15 4 | 1
253 4 | 2
19857 4 | 3
Zamiast tego powinno to być:
4,15,253,19871
Niestety jestem dość śmieci w tego rodzaju sprawach, udało mi się wyczyścić wszystkie wiersze i przejść do pliku CSV, ale nie byłem w stanie deduplikować i pogrupować wierszy. Teraz mam to:
awk 'BEGIN{OFS=",";} {split($line, part, " "); print part[1],part[2],part[4]}' | awk '{ gsub (" ", "", $0); print}'
Ale wszystko, co robi, to sprzątanie śmieci i ponowne drukowanie wierszy.
Jaki jest najlepszy sposób na masowanie wierszy do wyżej wspomnianego wyjścia?
shell-script
text-processing
awk
sed
csv
Paweł
źródło
źródło
Odpowiedzi:
Sposobem na to jest umieszczenie wszystkiego w haszu.
edycja: moja pierwsza odpowiedź nie odpowiedziała poprawnie na pytanie
źródło
NF<4{$4="no_type";}
na początkuPerl na ratunek:
Przechowuje dwie tabele, tablicę typów i tablicę identyfikatorów. Dla każdego identyfikatora przechowuje sumę według typu.
źródło
Jeśli GNU datamash jest dla ciebie opcją, to
źródło
Python (a
pandas
zwłaszcza biblioteka jest bardzo odpowiednia do tego rodzaju pracy)To odczytuje dane csv do
pandas DataFrame
Następnie grupujemy te dane według
id
i bierzemy sumę kolumnycount
unstack
Przekształca to, aby przesunąć id do kolumn, afillna
wypełnia puste pola z 0-tychTo zwraca
Ponieważ ramka danych zawiera brakujące dane (puste kombinacje typu id), panda przekształca
int
s nafloat
(ograniczenie wewnętrznych działań). Jeśli wiesz, że dane wejściowe będą tylko int, możesz zmienić następny na ostatni wiersz nadf_sum = df.groupby(('type', 'id'))['count'].sum().unstack('type').fillna(0).astype(int)
źródło
Możesz użyć Perla do zapętlenia pliku CSV i gromadzenia sumy odpowiednich typów w haszu podczas podróży. Na koniec wyświetl informacje zebrane dla każdego identyfikatora.
Struktura danych
Pomaga to zrozumieć poniższy kod:
Perl
Wynik
źródło
moje zdanie nie różni się zbytnio od innych. Używa GNU awk, który ma tablice tablic
wyjścia
źródło
Możesz użyć tego kodu do podsumowania wartości na podstawie kolumny identyfikatora,
Dodałem jedną instrukcję awk po twoim kodzie
Śmiało z tym ...
źródło