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
pandasbiblioteca en particular es muy adecuada para este tipo de trabajoEsto lee los datos csv a un
pandas DataFrameLuego grupo de los mismos por parte
id, y tomamos la suma de la columnacountEl
unstackforma esto para mover los id a las columnas, yfillnallena 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
ints 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