2016-12-26 3 views
-1

Unten ist mein Eingangs- und Ausgangs .txt Dateien.Wie durch Spaltenwerte in Zeilen- und Spaltenkopf zu gruppieren und dann die Spalten summieren dynamisch

ich gruppieren möchten durch die Daten von StatusDate und Method. Und dann summieren Sie die Werte auf der Grundlage der StatusDate und Method.

Eingabe.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 

Ich verwende awk und die Daten durch awk -F, '{if($8=="GET") print }' Aufspalten, dann den Summenwert berechnet wird. Da die Dateigröße sehr groß ist, gibt es eine Verzögerung.

Ist es möglich, alles in einem Schritt zu tun? Also wird die Dateioperation reduziert?

Antwort

0

Sie können eine GNU awk Skript wie folgt verwendet werden:

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) 
    } 

Führen Sie das Skript wie folgt aus: awk -F, -v OFS=',' script.awk Input.txt

Verwandte Themen