2011-08-07 16 views
6

Parece que no puedo encontrar una solución awk para esta sencilla tarea. Puedo resumir fácilmente una columna (3 $) basado en un campo de juego ($ 1) con:columna de suma basada en dos campos coincidentes utilizando awk

awk -F, '{array[$1]+=$3} END { for (i in array) {print i"," array[i]}}' datas.csv 

Ahora, ¿cómo puedo hacer que en base a dos campos? Digamos $ 1 y $ 2? Aquí hay una muestra de datos:

P1,gram,10 
P1,tree,12 
P1,gram,34 
P2,gram,23 
... 

Simplemente necesito sumar la columna 3 si el primer y el segundo campo coinciden.

¡Gracias por cualquier ayuda!

Respuesta

6

Al igual que

awk -F, '{array[$1","$2]+=$3} END { for (i in array) {print i"," array[i]}}' datas.csv 

Mi resultado

P1,tree,12 
P1,gram,44 
P2,gram,23 

EDITAR

A medida que la OP necesita las comas para permanecer en la salida, he editado la respuesta anterior usando @ yi_H de " comma fix ".

+0

gracias por su respuesta Ray Toal, pero ya trató esta solución y no se ajusta a mis necesidades, en De hecho, realmente necesito mantener mis campos separados para su posterior procesamiento ... – Chargaff

+2

comma fix: 'array [$ 1", "$ 2]' –

+0

La corrección de @ yi_H conserva la salida de tres columnas; respuesta editada –

1

Para una solución que necesitan menos memoria, pero que necesitan clasificar primero (nada es gratis):

sort datas.csv | awk -F "," 'NR==1{last=$1 "," $2; sum=0;}{if (last != $1 "," $2) {print last "," sum; last=$1 "," $2; sum=0;} sum += $3;}END{print last "," sum;}' 
Cuestiones relacionadas