나는 가지고있다
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]
}
}