2016-01-12 1 views
0

вопрос для скрипта awk (ref предыдущий вопрос несколько недель назад), но немного сложнее.awk sum collect in groups

входной файл выглядит:

Group1 
id  val1  val2 
--------------------------- 
idone  2  10 
idone  3  12 
idone  6   9 
idtwo  8   3 
idtwo  14   1 

Subtotal 33  35 


Group2 
id  val1  val2 
------------------------ 
idone  2   3 
idone  1   4 
idtwo  3   6 
idtwo  4   7 

Subtotal 10  20 

Total 43  55 

Там может быть несколько групп и в каждой группе больше записей. Я ограничил свой пример двумя именами деталей idone, idtwo и 2 группами.

Теперь целью является их обобщение.
с результатом, как:

  val1  val2 

idone  14   38 
idtwo  29   17 

total  43   55  

Выходной макет волен выбирать: , если вы предпочитаете это может выглядеть так:

total_idone_val1=14 
total_idone_val2=38 
total_idtwo_val1=29 
total_idtwo_val2=17 

overall_total_val1=43 
overall_total_val2=55 

ответ

1

дать этому AWK CMD попробовать:

awk 'NF==3&&FNR>3&&!/[Tt]otal/{v1[$1]+=$2;v2[$1]+=$3}END{print "id","v1","v2"; 
       for(x in v1){ 
       print x,v1[x],v2[x] 
       s1+=v1[x] 
       s2+=v2[x] 
     } 
     print "total",s1,s2}' f1 f2 

дает:

id v1 v2 
idtwo 29 17 
idone 14 38 
total 43 55