Soma várias colunas

1

Eu preciso fazer várias somas; meu arquivo de entrada é:

DATE|NATION|CITY|FILES|REVENUE|FREQUENCY|INVESTMENT
20170807|USA|VIRGINIA|TIMES|1919150|1779|282075
20170807|USA|NYC|ROADS|92877|41|1599
20170808|USA|PENS|ROADS|133001|7|1
20170808|USA|NYC|TIMES|361625|1592|0
  1. Soma $ 5 em cada uniq de $ 1 (data)
  2. soma $ 5 em cada uniq onde $ 4 == "TIMES"
  3. some $ 5 em cada uniq onde $ 4 == "ROADS"
  4. some $ 5 em cada uniq onde $ 4 == "ROADS" e $ 3 == "NYC"
  5. organizar com base na coluna $ 1

minha saída esperada

DATE|REV|TIMES|ROADS|ROADS&NYC
20170807|2012027|1919150|92877|92877
20170808|494626|361625|133001|0

Eu só sei como somar com base em 1 coluna

awk -F"|" '{FS=OFS="|"}{col[$1]+=$5} END {for (i in col) print i, col[i]}'
    
por dars 17.08.2017 / 10:49

2 respostas

0

Solução gawk complexa para alcançar o objetivo:

awk 'BEGIN{ FS=OFS="|" }NR==1{ next }{ sum[$1]+=$5 }
     $4=="TIMES"{ d[$1]["t"]+=$5 }
     $4=="ROADS"{ d[$1]["r"]+=$5 }$3=="NYC" && $4=="ROADS"{ d[$1]["r&n"]+=$5 }
     END{ print "DATE|REV|TIMES|ROADS|ROADS&NYC"; 
     for(i in d) print i, sum[i], int(d[i]["t"]), int(d[i]["r"]), int(d[i]["r&n"]) }' file

A saída:

DATE|REV|TIMES|ROADS|ROADS&NYC
20170807|2012027|1919150|92877|92877
20170808|494626|361625|133001|0
    
por 17.08.2017 / 11:37
0

Aqui está a awk solution:

awk -F'|' 'NR>1{I[$1]+=$5}
           ($4=="TIMES"){T[$1]+=$5}
           ($4=="ROADS"){R[$1]+=$5}
           ($4=="ROADS" && $3=="NYC"){RN[$1]+=$5}
END{ print "DATE|REV|TIMES|ROADS|ROADS&NYC"; for (x in I)
     printf"%d|%d|%d|%d|%d\n", x, I[x], T[x], R[x], RN[x]}' infile.txt

A saída é:

DATE|REV|TIMES|ROADS|ROADS&NYC
20170807|2012027|1919150|92877|92877
20170808|494626|361625|133001|0
    
por 17.08.2017 / 11:33

Tags