csvの熱条件に基づいてawkの平均を計算します。

csvの熱条件に基づいてawkの平均を計算します。

私は次のcsv形式を持っています。一ヶ月を通してvarsがありますが、塊に分けられました。:

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=","}...

次に、4番目のフィールドを配列インデックス/キーとして使用し、最初のフィールドを同じ配列位置の既存の値に追加する値として使用するdate12つの配列を作成します。date2$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(2行目)

同じロジックは、日付が同じで日付が異なるすべての行に展開されます。

最後に、ループを使用して配列forのキーを繰り返しdate1(またはdate22つの配列のキーが等しい => $4key、見つかった各値に対して(=date $ 4)を印刷し、値の合計もkey印刷します。date1[key]=$1同じ日付全体の値を値$4で割った値date2[key]=同じ日付の行で見つかった数値の数=同じです$4

おすすめ記事