[英]How to find rows with same value in one or more rows and adding the values using awk
我的數據如下:
Name,Team,First Test, Second Test, Third Test
Tom,Red,5,17,22
Joe,Green,3,14,22
Maria,Blue,6,18,21
Fred,Blue,2,15,23
Carlos,Red,-1,15,24
Phuong,Green,7,19,21
Enrique,Green,3,16,20
Nancy,Red,9,12,24
我需要找到Green Teams Average。 我在如何完成它方面有點麻煩。
到目前為止,我有:
awk '/Green/' teamlist.txt
這給了我以下結果:
Joe,Green,3,14,22
Phuong,Green,7,19,21
Enrique,Green,3,16,20
但是,當我嘗試打印以下語句時:
awk '/Green/ {print $3, $4, $5}' teamlist.txt
我只收到空白輸出,什么也不顯示。 我還需要添加列$ 3,$ 4和$ 5,然后除以9。
到目前為止,這是我的代碼:
#Begin. Start with the Field Separator using comma.
BEGIN {
FS=",";
}
#Middle.
{
if (NR > 1)
{
name[NR] = $1; #Name record is field 1
average[NR] = ($3 + $4 + $5) / 3; #Average is number of records which are fields 3,4,5. Add them up and then divide by 3.
testOneAverage += $3 #Average of test one. Keeps adding field three to itself for the number of records.
testTwoAverage += $4 #Average of test two. Keeps adding field four to itself for the number of records.
testThreeAverage += $5 #Average of test three. Keeps adding field five to itself for the number of records.
}
}
#End
END {
print "Name Average";
print "------ ------";
i = 1;
while (i <= FNR) {
printf("%-10s %7.2f\n", name[i] , average[i++]);
}
if (NR > 0) {
print "---------------------------";
print "Average for Test 1: " testOneAverage / 8;
print "Average for Test 2: " testTwoAverage /8;
print "Average for Test 3: " testThreeAverage /8;
}
您的短語: 我需要找到Green Teams Average + 添加列$ 3,$ 4和$ 5,然后除以9-表示您要獲取總體/總均值。
AWK解決方案:
awk -F',' 'NR>1 && $2=="Green"{ ++c; sum+=$3+$4+$5 }END{ print sum/(c*3) }' file
輸出:
13.8889
沒有輸出任何內容的原因是您需要明確指出“,”是您的字段分隔符,例如:
$ awk -F, '/Green/ {print $3, $4, $5}' teamlist.txt
3 14 22
7 19 21
3 16 20
接下來,您要對所有列3,4和5求和並除以9。
$ awk -F, '$2=="Green"{i+=3;t+=$3+$4+$5}END{printf "Average %.2f\n", t/i}' teamlist.txt
Average 13.89
綜合所有內容,我們可以:
$ cat tst.awk
BEGIN { FS="," }
NR > 1{
name[++i]=$1 # save name
avg[i]=($3+$4+$5)/3 # save avg of this name
test1+=$3 # sum up cols 3, 4, 5 resp.
test2+=$4
test3+=$5
lines++ # count nr of lines
if ($2=="Green"){
green+=$3+$4+$5 # for "Green" sum up the tests
gl++ # remember how many green lines there are
}
}
END {
print "Name Average";
print "------ ------";
for (i in name)
printf("%-10s %7.2f\n", name[i] , avg[i]) # print avg's for each person
printf "Average Test 1: %.2f\n", test1/lines # print avg's per test
printf "Average Test 2: %.2f\n", test2/lines
printf "Average Test 3: %.2f\n", test3/lines
printf "Average Green: %.2f\n", green/(gl * 3) # print avg for green
}
然后調用:
$ awk -f tst.awk teamlist.txt
Name Average
------ ------
Tom 14.67
Joe 13.00
Maria 15.00
Fred 13.33
Carlos 12.67
Phuong 15.67
Enrique 13.00
Nancy 15.00
Average Test 1: 4.25
Average Test 2: 15.75
Average Test 3: 22.12
Average Green: 13.89
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.