【问题标题】:awk columnwise sum a particular groupawk 按列对特定组求和
【发布时间】: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} 
        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'

【问题讨论】:

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

标签: linux bash unix awk scripting


【解决方案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}
                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
    
  • 代码没有经过测试

【讨论】:

  • 我在我的问题中尝试过,但它在 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 的所有列求和。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
  • 2022-06-20
  • 1970-01-01
  • 2019-06-12
  • 2015-10-08
相关资源
最近更新 更多