Tengo algo de salida en forma de:
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
...
Lo cual es bastante desordenado y necesita ser limpiado en un CSV para que pueda regalarle a un Gerente de Proyecto para ellos la hoja de cálculo.
El núcleo del problema es este: necesito que la salida de esto sea:
id, sum_of_type_1, sum_of_type_2, sum_of_type_3
Un ejemplo de esto es id "4":
14 4 | 3
15 4 | 1
253 4 | 2
19857 4 | 3
Esto debería ser:
4,15,253,19871
Desafortunadamente, soy bastante basura en este tipo de cosas, he logrado limpiar todas las líneas y ponerlas en CSV, pero no he podido deduplicar y agrupar las filas. En este momento tengo esto:
awk 'BEGIN{OFS=",";} {split($line, part, " "); print part[1],part[2],part[4]}' | awk '{ gsub (" ", "", $0); print}'
Pero todo lo que hace es limpiar los caracteres de basura e imprimir las filas nuevamente.
¿Cuál es la mejor manera de masajear las filas en el resultado mencionado anteriormente?
shell-script
text-processing
awk
sed
csv
Pablo
fuente
fuente
Respuestas:
Una forma de hacerlo es poner todo en un hash.
editar: mi primera respuesta no respondió la pregunta correctamente
fuente
NF<4{$4="no_type";}
al principioPerl al rescate:
Mantiene dos tablas, tabla de tipos y tabla de identificadores. Para cada id, almacena la suma por tipo.
fuente
Si GNU Datamash es una opción para usted, entonces
fuente
Python (y la
pandas
biblioteca en particular es muy adecuada para este tipo de trabajoEsto lee los datos csv a un
pandas DataFrame
Luego grupo de los mismos por parte
id
, y tomamos la suma de la columnacount
El
unstack
forma esto para mover los id a las columnas, yfillna
llena los campos vacíos con 0Esto vuelve
Debido a que el marco de datos contiene datos faltantes (combinaciones de tipo de identificación vacías), pandas transforma los
int
s enfloat
(limitación del funcionamiento interno) Si sabe que las entradas serán solo int, puede cambiar la penúltima línea adf_sum = df.groupby(('type', 'id'))['count'].sum().unstack('type').fillna(0).astype(int)
fuente
Puede usar Perl para recorrer el archivo CSV y acumular la suma de los tipos apropiados en un hash mientras está en camino. Y al final, muestre la información recopilada para cada ID.
Estructura de datos
Esto ayuda a dar sentido al código a continuación:
Perl
Salida
fuente
mi opinión, no muy diferente de los demás. Utiliza GNU awk que tiene matrices de matrices
salidas
fuente
Puede usar este código para resumir valores basados en su columna de identificación,
He agregado una declaración awk después de su código
Adelante con esto ...
fuente