2016-12-20 3 views
-1

Ниже приведены данные ввода и вывода .txt.Как группировать по значениям столбцов в заголовке строки и столбца, а затем суммировать значение

Я хочу объединить данные по StatusDate и Method. И затем суммируйте значения на основе StatusDate и Method.

input.txt

No,Date,MethodStatus,Key,StatusDate,Hit,CallType,Method,LastMethodType 
112,12/15/16,Suceess,Geo,12/15/16,1,Static,GET,12/15/16 
113,12/18/16,Suceess,Geo,12/18/16,1,Static,GET,12/18/16 
114,12/19/16,AUTHORIZED,Geo,12/19/16,1,Static,GET,12/19/16 
115,12/19/16,AUTHORIZED,Geo,12/19/16,1,Static,GET,12/19/16 
116,12/19/16,Suceess,Geo,12/19/16,1,Static,PUT,12/19/16 
117,12/19/16,Suceess,Geo,12/19/16,1,Static,PUT,12/19/16 
118,12/19/16,Waiting,Geo,12/19/16,1,Static,GET,12/19/16 
119,12/19/16,AUTHORIZED,Geo,12/19/16,1,Static,GET,12/19/16 
120,12/17/16,Suceess,Geo,12/17/16,1,Static,GET,12/17/16 
121,12/17/16,Suceess,Geo,12/17/16,1,Static,GET,12/17/16 
130,12/16/16,Suceess,Geo,12/16/16,1,Static,GET,12/16/16 

out.txt

StatusDate,12/15/16,12/16/16,12/17/16,12/17/16,12/18/16,12/19/16,12/19/16,12/19/16,12/19/16,12/19/16,12/19/16,Grand Total 
GET,1,1,1,1,1,1,1,1,1,,,9 
PUT,,,,,,,,,,1,1,2 
Grand Total,1,1,1,1,1,1,1,1,1,1,1,11 

Я использую awk и разделив данные по awk -F, '{if($8=="GET") print }', то вычисления значения суммы. Поскольку размер файла огромен, есть задержка.

Можно ли сделать все за один шаг? Таким образом, операция файла будет уменьшена?

+3

Можете ли вы показать код, который делает это? В противном случае, как кто-нибудь знает, как сделать его более эффективным? – David

ответ

0
awk -F ',' ' 
    /GET/{ Get[ $2]++} 
    /PUT}{ Put[ $2]++} 
    {Total[$2]++} 

    END { 
    printf("StatusDate') 
    for (d in Total) printf(",%s", d) 
    printf("\nTotal GET") 
    for (d in Total) printf(",%d", Get[d]) 
    printf(" PUT") 
    for (d in Total) printf(",%d", Put[d]) 
    printf(" Grand Total") 
    for (d in Total) printf(",%d", Total[d]) 
    printf("\n") 
    } 
    ' Input.txt 
  • хранят данные в 3 массива в каждой строке
  • несколько петель, чтобы Disply результат в конце
0

Вы можете использовать ассоциативный массив, чтобы следить за скоплениями.

NR == 1 { 
    next 
} 

$8 == "GET" { 
    Get[$2]++ 
    g++ 
    Total[$2]++ 
    next 
} 

$8 == "PUT" { 
    Put[$2]++ 
    p++ 
    Total[$2]++ 
    next 
} 

END { 
    printf("StatusDate") 
    for (d in Total) printf(",%s", d) 
    printf(",Grand Total\nGET") 
    for (d in Total) printf(",%d", Get[d]) 
    printf(",%d\nPUT", g) 
    for (d in Total) printf(",%d", Put[d]) 
    printf(",%d\nGrand Total",p) 
    for (d in Total) printf(",%d", Total[d]) 
    printf(",%d\n",g+p) 
} 
0
$ awk -F, 'NR==1 {printf "%s",$8$2; t="Total"; v[t]; next} 
       {d[$2]; v[$8]; a[$2,$8]++; a[$2,t]++} 
      END {n=asorti(d,ds); 
        for(i=1;i<=n;i++) printf "%s", FS ds[i]; 
        print ""; 
        for(k in v) 
        {printf "%s", k; 
        for(i=1;i<=n;i++) printf "%s", FS a[ds[i],k]; 
        print ""}}' file 


MethodDate,12/15/16,12/16/16,12/17/16,12/18/16,12/19/16 
PUT,,,,,2 
GET,1,1,2,1,4 
Total,1,1,2,1,6 
+0

Выход не соответствует ожидаемому результату, Общее значение неверно –

Смежные вопросы