2013-04-08 39 views
1

我有一個數據集,看起來像這樣:平均每兩行的所有列的第一個除外

ITEM1 20 30 12
ITEM1 10 50 17
ITEM2 -9 112 15
ITEM2 -9 100 10

實際數據集有101列。我想打印每列中連續值的平均值(除了包含名稱的第一列)。

所以預期輸出將是

ITEM1 15 40 14.5
ITEM2 -9 106 12.5

我從這個link發現,我可以用下面的代碼的單個列要這樣做

awk '{sum+=$2}(NR%2)==0{print sum/2; sum=0;}' 

但我無法弄清楚如何做到這一點的其餘列和原理t爲平均值行的唯一行名(例如:item1)。我想是這樣的:

awk '{for(i=2;i<=NF;i++) sum[i]+=$i} NR%2==0 {print sum[i]/2;sum[i]=0}' 

但代碼顯然是不正確,我將不勝感激,如果任何人都可以指出我在做什麼錯誤以及如何改進它得到預期result.Thanks!

+0

你知道'NR%2'是一個模運算符,它表示每2行都有一個操作嗎?你想在awk的'END {....}'中執行那個(用模測試)。塊。多看一些其他的例子會讓你在那裏。祝你好運。 – shellter 2013-04-08 19:37:33

回答

0

總和線連續對開始在2號線的動態若干領域:

$ awk 'NR>1{for(i=2;i<=NF;i++)a[i]+=$i;if(NR%2){printf "%s ",n$1;n="\n";for(i=2;i<=NF;i++)printf "%s ",a[i]/2;delete a}}' file 
item1 15 40 14.5 
item2 -9 106 12.5 
+0

謝謝,但我的實際數據集有101列,所以我想寫代碼來處理每個列與for語句 - 你能告訴我我該怎麼做?再次感謝 – psaima 2013-04-08 19:54:38

+0

我最初讀爲101行而不是列,**見編輯**! – 2013-04-08 20:08:10

+0

對不起 - 我的錯!非常感謝更新的代碼。 – psaima 2013-04-08 20:43:08

2

嘗試用你的101列本awk的解決方案文件:

awk 'n<2{for(i=2;i<=NF;i++)a[i]+=$i;n++;} 
    n==2{for(i=2;i<=NF;i++)s=s sprintf("%s ",a[i]/2) 
     print $1,s;s="";delete a;n=0}' file 

如果你喜歡NR%2檢查,這個作品也是:

awk '{for(i=2;i<=NF;i++)a[i]+=$i} 
     !(NR%2){for(i=2;i<=NF;i++)s=s sprintf("%s ",a[i]/2) 
     print $1,s;s="";delete a}' file 

這兩個awk行輸出與你的例子相同:

item1 15 40 14.5  
item2 -9 106 12.5  

  • 作品列的動態數
  • 沒有在每一行的後面加上一個空格,我上有點懶,如果它是至關重要的,它也可以刪除。
+0

感謝這兩個解決方案 - 這些幫助我瞭解更多 – psaima 2013-04-08 20:52:41

+0

sprintf之前s = s的含義是什麼?矢量是否存儲在s中?因爲如果我打印s(不含$ 1),我會得到2到NF的位置。 – 2013-05-23 08:54:45

+0

@ManuelRamón's = s連接衝刺結果(..)' – Kent 2013-05-23 08:59:40

相關問題