2015-05-20 58 views
1

Using awk to bin values in a list of numbers」提供了一個解決方案,使用awk對列中每個3點的平均值進行平均。awk每列中n個數據的平均值

如何將它擴展爲無限數量的列來支持格式?例如:

2457135.564106 13.249116 13.140903 0.003615 0.003440 
2457135.564604 13.250833 13.139971 0.003619 0.003438 
2457135.565067 13.247932 13.135975 0.003614 0.003432 
2457135.565576 13.256441 13.146996 0.003628 0.003449 
2457135.566039 13.266003 13.159108 0.003644 0.003469 
2457135.566514 13.271724 13.163555 0.003654 0.003476 
2457135.567011 13.276248 13.166179 0.003661 0.003480 
2457135.567474 13.274198 13.165396 0.003658 0.003479 
2457135.567983 13.267855 13.156620 0.003647 0.003465 
2457135.568446 13.263761 13.152515 0.003640 0.003458 

平均值每5行,應該輸出像

2457135.564916 13.253240 13.143976 0.003622 0.003444 
2457135.567324 13.270918 13.161303 0.003652 0.003472 

其中所述第一結果是第一1-5行的平均,和第二個結果是平均6-10行。

+2

不太清楚你的意思。你可以粘貼所需的輸出與你的嘗試?在另一個問題中,anubhava的腳本看起來相當不錯並且易於使用 – fedorqui

+2

使用一個和數組和'for(i = 1; i <= NF; i ++)'循環來控制求和。對於打印,您必須確定您感興趣的原始格式的保真度級別以及如何確定該格式。例如,如果值在99999.95和100000.05之間移動,會發生什麼情況?你只是使用6位小數的空格分隔數字嗎?如果是這樣,那很容易。如果您需要確保小數點前的7,2,2,1,1位數字,即使數字之前只有5,1,1,1,1位數字,您也必須加倍努力。 –

回答

4

接受的答案Using awk to bin values in a list of numbers是:

awk '{sum+=$1} NR%3==0 {print sum/3; sum=0}' inFile 

明顯延長平均所有列的是:

awk 'BEGIN { N = 3 } 
    { for (i = 1; i <= NF; i++) sum[i] += $i } 
    NR % N == 0 { for (i = 1; i <= NF; i++) 
        { 
         printf("%.6f%s", sum[i]/N, (i == NF) ? "\n" : " ") 
         sum[i] = 0 
        } 
       }' inFile 

這裏的額外的靈活性是,如果你想5行的組塊,只需將3的一次出現更改爲5.這會忽略文件結尾處多達N-1行的塊。 !如果要,可以添加一個END塊打印合適的平均如果NR%N = 0。

對於樣品輸入數據,我從上面的腳本獲得的輸出是:

2457135.564592 13.249294 13.138950 0.003616 0.003437 
2457135.566043 13.264723 13.156553 0.003642 0.003465 
2457135.567489 13.272767 13.162732 0.003655 0.003475 

如果你想分析輸出格式應該是什麼,你可以使代碼更加複雜。我只是使用%.6f來確保6位小數。

如果要N到是一個命令行參數,則可以使用-v選項變量設置中繼到awk

awk -v N="${variable:-3}" \ 
    '{ for (i = 1; i <= NF; i++) sum[i] += $i } 
    NR % N == 0 { for (i = 1; i <= NF; i++) 
        { 
         printf("%.6f%s", sum[i]/N, (i == NF) ? "\n" : " ") 
         sum[i] = 0 
        } 
       }' inFile 

當與$variable組調用到5中,從所生成的輸出示例數據爲:

2457135.565078 13.254065 13.144591 0.003624 0.003446 
2457135.567486 13.270757 13.160853 0.003652 0.003472 
+0

非常感謝您的回答。爲了將你的awk代碼嵌入到bash腳本中,我使用雙引號和轉義'\ $'和'\「'符號修改了你的例子,現在'3'是一個bash參數。 –

+2

用法:'awk -v N = $ bash_var'...代碼像以前一樣...'' - 將變量傳遞到'awk'腳本是一種更好的方法。當然,你會丟棄BEGIN塊。 –

+2

@leonardvertighel - 不,絕對不要把腳本放入雙引號並開始轉義'$'s和'「,這完全是錯誤的方法。按照喬納森的建議,閱讀http://cfajohnson.com/shell/cus-faq-2.html#Q24並獲得Arnold Robbins編寫的「有效的Awk編程」第4版。 –