私は次の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番目のフィールドを配列インデックス/キーとして使用し、最初のフィールドを同じ配列位置の既存の値に追加する値として使用するdate1
2つの配列を作成します。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
(またはdate2
2つの配列のキーが等しい => $4
)key
、見つかった各値に対して(=date $ 4)を印刷し、値の合計もkey
印刷します。date1[key]
=$1
同じ日付全体の値を値$4
で割った値date2[key]
=同じ日付の行で見つかった数値の数=同じです$4
。