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" && $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 2
是b2
并且column 3
是c2
,则将column 4
相加并打印值。
【讨论】:
如何在其中使用循环 ..如果我在 x+= 之前将 for 循环放在另一个答案中,我会收到语法错误 @bl3e 我不明白你喜欢循环什么。此解决方案循环遍历所有行,一一测试,如果确定则添加。 通过循环我的意思是对所有列求和..不仅仅是第 4 列。错误是由特殊字符引起的 您可以这样做:将x+=$4
更改为for (i=4;i<=8;i++) x+=$i
。然后它将所有行上从4
到8
的所有列求和。以上是关于awk 按列对特定组求和的主要内容,如果未能解决你的问题,请参考以下文章