根據csv中的列條件計算awk的平均值

根據csv中的列條件計算awk的平均值

我有以下csv格式。有整個月的瓦爾,但我把它分成了塊

2415.02,2203.35,00:17,25:May:2017,
3465.02,2203.35,01:17,25:May:2017,
2465.02,2203.35,12:17,26:May:2017,
465.02,2203.35,13:17,26:May:2017,
245.02,2203.35,14:17,26:May:2017,
2465.02,2203.35,05:17,26:May:2017,
2865.02,2203.35,06:17,27:May:2017,
2490.12,2203.35,07:17,27:May:2017,

我需要根據當天的值(4 美元)計算第一列的平均值(1 美元)。請注意,如果需要更容易計算,我可以重新格式化日期。

我的悲慘嘗試是這樣的:

$ awk  '{FS=","; day=$4;value+=$1} END{ print  day,value/NR}' file
27:May:2017 2109.41

我需要這樣的輸出:

Average for 25th May is *average_for_25th_day*
Average for 27th May is *average_for_26th_day*
Average for 28th May is *average_for_27th_day*

答案1

看一下這個:

awk -F, '{date1[$4]+=$1;++date2[$4]}END{for (key in date1) print "Average of",key,"is",date1[key]/date2[key]}' file
Average of 27:May:2017 is 2677.57
Average of 26:May:2017 is 1410.02
Average of 25:May:2017 is 2940.02

解釋:

-F,:定義分隔符號。或者可以是awk 'BEGIN{FS=","}...

然後我們建立兩個數組date1date2其中我們使用第四個字段$4作為數組索引/鍵,使用第一個字段$1作為添加到相同數組位置的現有值的值。

所以對於第一行我們會有

date1[27:May:2017]+=2415.02
++date2[27:May:2017]--> 將值增加 1 --> 第一行的值 1

對於下一個相同的日期(第 2 行),我們將有

date1[27:May:2017]+=2415.02 + 3465.02
++date2[27:May:2017]--> 將數值增加 1 --> 值 2(第二行)

相同的邏輯擴展到具有相同日期的所有行以及所有不同的日期。

最後,我們使用循環for來迭代數組的鍵date1(或者date2- 兩個數組中的鍵相同 => $4),對於每個key找到的值,我們打印key(=日期 $4) 並且我們還打印date1[key]值 = 的總和$1同一日期的值$4除以date2[key]值 = 找到的具有相同日期的行的數字計數 = 相同$4

答案2

這是一個變體,使用GNU 資料混合進行平均:

datamash -t, groupby 4 mean 1 < file | 
  awk -F'[,:]' '{printf "Average for %dth %s is %f\n", $1,$2,$4}'
Average for 25th May is 2940.020000
Average for 26th May is 1410.020000
Average for 27th May is 2677.570000

相關內容