다음과 같은 파일이 있습니다.
30901 foo1 bar1 89
30902 foo2 bar2 51
30903 foo3 bar3 101
30903 foox bary 12
30903 fooz bara 23
30903 foob barc 62
30904 fooe barf 59
...
...
내 출력이 다음과 같이 출력되기를 원합니다.
30901 89
30902 51
30903 49.5
...
49.5
30903
는 열 1에 있는 id:의 중복 항목 4개 모두 에 대한 네 번째 열의 평균입니다 .
내가 할 수 있는 일은
cat <logfile> | awk '{print $1}' | uniq -c
첫 번째 열(id)을 기준으로 중복 항목 수를 가져 오는 고유 항목 수를 얻는 것뿐입니다.
답변1
노력하다
awk '{c[$1]++ ; t[$1]+=$4 }
END { for (cc in c ) if ( c[cc]>1 ) printf "%s : %.1f\n",cc,t[cc]/c[cc];}' file.log
이것은
30903 : 49.5
출력을 얻으려면 if (c[cc]>1)
섹션을 제거하십시오.
스크립트는 기본적으로 가치를 계산 c[$1]++
하고 t[$1]+=$4
추가합니다.
c[x]
count(x)의 경우, 즉$1
첫 번째 필드t[x]
4번째 필드의 전체 값의 합인 total(x)입니다.
마지막으로 모든 값을 반복하고 평균을 계산하고 인쇄합니다.
답변2
밀러(http://johnkerl.org/miller/doc) 당신은 실행할 수 있습니다
mlr --nidx stats1 -a mean -f 4 -g 1 inputFile
그리고
30901 89.000000
30902 51.000000
30903 49.500000
30904 59.000000
-f 4
통계를 계산할 값 필드 이름을 설정합니다(네 번째 필드).-g 1
설정은 필드 이름(첫 번째 필드)별로 그룹화됩니다.