2016-12-26 4 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 }', то вычисления значения суммы. Поскольку размер файла огромен, есть задержка.

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

ответ

0

Вы можете использовать GNU AWK сценария, как это:

script.awk

BEGIN { PROCINFO["sorted_in"] = "@ind_str_asc" } 

function remember(theDate, mem) { 
    mem[ theDate] +=1 
    # in Totals the column sum is stored for each possible date (i.e the columns) 
    Totals[theDate] += 1 
} 

# with header 0 or 1 the first line in output is differentiated 
# OFS is used, so it is possible to use a commandline option like 
# -v OFS='\t' or -v OFS=',' 
function printMem(mem, name, header) { 
    printf("%s%s",name,OFS) 
    sum=0 
    for(k in Totals) { 
     if(header) 
      printf("%s%s", k, OFS) 
     else { 
      printf("%s%s", mem[k], OFS) 
      sum += mem[k] 
     } 
    } 
    if(!header) 
     printf("%s", sum) 
    else 
     printf("Grand Total") 
    print "" 
} 

# different methods are stored in different arrays 
$8 == "GET" { remember($2, get) } 
$8 == "PUT" { remember($2, put) } 

END { # print the stored values 
     # the first line header 
     printMem(Totals , "StatusDate", 1) 
     printMem(get , "GET", 0) 
     printMem(put , "PUT", 0) 
     # the summary line 
     printMem(Totals , "Grand Total", 0) 
    } 

Выполнить скрипт так: awk -F, -v OFS=',' script.awk Input.txt

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