2014-12-25 29 views
2

我是新来的外壳scripting.I有一个CSV文件,我想打印一些符合条件AWK纵列总结一组特定

 
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' 
+1

您的命令看起来像字符单引号和双引号,但不是:'''''''和'“'vs'”' –

+0

错误消息是误导。谢谢! – bl3e

回答

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 
    
  • 和代码没有测试

+0

我试过了,但发现在i = k附近有语法错误 – bl3e

1

你的文件没有逗号分隔,其选项卡或空间,所以你不需要-F
这可能会:

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

这将会如果column 2b2column 3c2,那么总和column 4和打印值。

+0

如何使用循环..如果我把循环只是在x + =之前,如另一个答案,我得到一个语法错误 – bl3e

+0

@ bl3e我不明白你想要循环什么。这个解决方案循环遍历所有的行,一个接一个地测试,如果没问题的话就添加。 – Jotne

+0

由循环我打算总结所有列..不只是4th.The错误是由于特殊字符 – bl3e