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

date1그런 다음 두 개의 배열 을 만들고 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(두 번째 줄)

동일한 논리는 동일한 날짜를 갖는 모든 라인과 모든 다른 날짜로 확장됩니다.

마지막으로 for루프를 사용하여 배열의 키를 반복하고 date1(또는 date2키가 두 배열 모두에서 동일함 => $4) 발견된 모든 항목에 대해 (=날짜 $4) key를 인쇄 하고 값 = 합계 도 인쇄합니다. 동일한 날짜에 대한 모든 값을 값 으로 나눈 값 = 동일한 날짜를 갖는 줄의 숫자 개수 = 동일 .keydate1[key]$1$4date2[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

관련 정보