2014-12-25 44 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