awk는 두 번째 열의 키를 기반으로 열의 평균을 계산합니다.

awk는 두 번째 열의 키를 기반으로 열의 평균을 계산합니다.

나는 가지고있다

Sample_A   100
Sample_A   200
Sample_B   300
Sample_B   100

1행의 각 키에 대해 2행에 있는 값의 평균을 인쇄하고 싶습니다.

Sample_A   150
Sample_B   200

다른 질문에 대한 훌륭한 답변을 사용하여 행 1의 각 키에 대해 행 2의 값 합계를 인쇄할 수 있습니다. 두 번째 열을 기준으로 첫 번째 열의 합계를 구합니다.

명령은 다음과 같습니다:

awk 'NR { k = $1; cnt[k] += $2 } END { print; for (k in cnt) print k,cnt[k]}' File.txt

이것은 생산할 것입니다

Sample_A  300
Sample_B  400

하지만 평균을 계산하려면 다음과 같이 키 발생 횟수를 저장하는 방법이 필요합니다.

awk 'NR { k = $1; cnt[k] += $2; count(k)=$2} END { print; for (k in cnt) print k,cnt[k]/count(k)}' File.txt

하지만 내 count(k)코드는 약간 눈이 멀고 작동하지 않습니다.

답변1

함께 awk할 수 있는 일:

awk '{seen[$1]+=$2; count[$1]++} END{for (x in seen)print x, seen[x]/count[x]}' infile
Sample_A 150
Sample_B 200

아니면 GNU를 사용하세요datamash:

datamash -t' ' --sort --group 1 mean 2 <infile
Sample_A 150
Sample_B 200

답변2

$ awk '{ sum[$1] += $2; count[$1] += 1 } END { for ( key in count ) { print key, sum[key] / count[key] } }' input
Sample_A 150
Sample_B 200

평균을 도출하려면 평균을 구하는 엔터티 수와 해당 값의 합계라는 두 가지가 필요합니다. count전자의 경우 배열을 사용하고 sum후자의 경우 배열을 사용합니다. 각 배열의 키는 데이터 파일의 첫 번째 열에 할당됩니다.

END그런 다음 데이터를 수집한 후 절을 사용하여 각 배열을 살펴보고 합계와 개수를 구하고 한 배열을 다른 배열로 나눈 다음 결과를 표시합니다.

스크립트 awk는 더 이상 한 줄에 모두 표시되지 않고 다음과 같이 다시 형식화되었습니다.

{ 
  sum[$1] += $2 
  count[$1] += 1
} 
END { 
  for (key in count) { 
    print key, sum[key] / count[key] 
  } 
}

관련 정보