簡體   English   中英

如何在一個或多個行中查找具有相同值的行,並使用awk添加值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM