Text-Processing

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

  • May 25, 2017

我有以下csv格式。整個月都有 vals,但我已經分塊了

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,

我需要計算第一列的平均值( $ 1) based on values for that day ( $ 4)。請注意,如果需要更輕鬆地計算,我可以重新格式化日期。

我悲慘的嘗試是這樣的:

$ 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*

看一下這個:

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 個欄位$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

引用自:https://unix.stackexchange.com/questions/367074