awk 按列对特定组求和

Posted

技术标签:

【中文标题】awk 按列对特定组求和【英文标题】:awk columnwise sum a particular group 【发布时间】:2015-02-23 07:08:02 【问题描述】:

我是 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 
        ENDfor(x in s)printf "sum of column %d is %s\n",x,s[x]’ test.csv

但它给出了语法错误

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

【问题讨论】:

命令中的字符看起来像单引号和双引号,但实际上不是: vs 'and vs " 错误信息具有误导性。谢谢! 【参考方案1】:

您可以结合两个条件:($2 == "b2" &amp;&amp; $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
                ENDfor(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

代码没有经过测试

【讨论】:

我在我的问题中尝试过,但它在 i=k 附近出现语法错误【参考方案2】:

你的文件不是逗号分隔的,它的制表符或空格,所以你不需要-F 这可能会:

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

如果column 2b2 并且column 3c2,则将column 4 相加并打印值。

【讨论】:

如何在其中使用循环 ..如果我在 x+= 之前将 for 循环放在另一个答案中,我会收到语法错误 @bl3e 我不明白你喜欢循环什么。此解决方案循环遍历所有行,一一测试,如果确定则添加。 通过循环我的意思是对所有列求和..不仅仅是第 4 列。错误是由特殊字符引起的 您可以这样做:将x+=$4 更改为for (i=4;i&lt;=8;i++) x+=$i。然后它将所有行上从48 的所有列求和。

以上是关于awk 按列对特定组求和的主要内容,如果未能解决你的问题,请参考以下文章

熊猫数据框分组和求和,组内,跨行值而不是按列

按列对分组数据帧进行采样

awk 对列数据求和

AWK文本求和求平均最大值最小值

如何通过使用 Python 对特定列进行分组来求和?

使用awk迭代unix命令nm并通过多个文件求和输出