awk columnwise sum一个特定的组

时间:2014-12-25 17:04:09

标签: linux bash unix awk scripting

我是shell脚本的新手。我有一个CSV文件,我想打印符合某些条件的列的行总和

column1   column2   column3   column4 column5.......    columnN
a1         b1        c1       0.5      50                100

a2         b2        c2       1       25                150

a1         b1        c2       0.5      25                 10

a2         b2        c2      2        20                100   

(假设逗号为分隔符 我可以通过

来汇总一个特定的列
 awk -F ',' '{ x = x + $4 } END { print x }'

1)如何在从第k个到第N个的循环中使用它来对具有数值的列求和?

2)另外,我如何有条件地使用它来仅对与某些条件匹配的行的列进行求和 比方说,column2是b2而column3是c2? 我能做到

  cat file| grep b2 |grep c2| awk...as answer to 1st question

但这会很天真。你可以帮我解决两个问题吗?

基于下面的答案我试过

awk -F’,' -v k=“3" -v n=“6" '$2=="b2" && $3="c2"{for(i=k;i<=n;i++)s[i]+=$i} 
        END{for(x in s)printf "sum of column %d is %s\n",x,s[x]}’ test.csv

但它会出现语法错误

 -bash: syntax error near unexpected token `i=k'

2 个答案:

答案 0 :(得分:2)

您可以结合两个条件:($2 == "b2" && $3 == "c2")和(from kth - nth columns

awk -F'whatever' -v k="$k" -v n="$n" 
                '$2=="b2" && $3="c2"{for(i=k;i<=n;i++)s[i]+=$i}
                END{for(x in s)printf "sum of column %d is %s\n", x,s[x]}' file

以上代码:

  • -F'whatever'是列分隔符
  • -v k="$k" -v n="$n" k and n是列范围。您可以对它们进行硬编码或使用shell变量:$k/$n
  • 输出类似于:

    sum of column 3 is 300
    sum of column 4 is 400
    
  • 且代码未经过测试

答案 1 :(得分:1)

您的文件不是逗号分隔,其标签或空格,因此您不需要-F
这可能会:

awk '$2=="b2" && $3=="c2" {x+=$4} END {print x}' file

如果column 2b2column 3c2,则为column 4和打印值。