Use of awk array function in Linux learning

echo 'zhaoy 59 58 53 56 57 54' >> scoreArray.txt
echo 'wangl 70 81 84 82 90 88' >> scoreArray.txt
echo 'qiane 70 72 74 76 75 72' >> scoreArray.txt
echo 'sunw 80 83 84 85 84 85' >> scoreArray.txt
echo 'lixi 96 98 90 95 95 96' >> scoreArray.txt

Write the following content into scoreArray.txt:

zhaoy 59 58 53 56 57 54
wangl 70 81 84 82 90 88
qiane 70 72 74 76 75 72
sunw 80 83 84 85 84 85
lixi 96 98 90 95 95 96

insert image description here

Now it is necessary to count how many numbers are higher than or equal to the average score of all users, and how many numbers are lower than the average score of all users.
awkAverage.awkThe content inside is as follows:

{
    
    
   sum = 0;
# 算出来所有用户的总成绩
   for(col = 2;col<=NF;col++){
    
    
      sum += $col;
   }
# 每行里边还有用户名,所以把字段个数减去1
   average[$1] = sum/(NF-1)
   print $1,average[$1]
}
END{
    
    
   for(user in average){
    
    
     averageSum =  averageSum+average[user]
   }
   print "averageSum " averageSum
# 算出来所有成绩平均值的平均值
   averageOfAvg = averageSum / NR;
   print "averageOfAvg: " averageOfAvg
# 统计大于等于平均成绩的数量和小于平均成绩的数量
   for(user in average){
    
    
      if( average[user] >= averageOfAvg){
    
    
         better++;
      }else{
    
    
         worse++;
      }
   }
   print "better: " better
   print "worse: " worse
}

awk -f awkAverage.awk scoreArray.txtto scoreArray.txtexecute awkAverage.awkthe content inside.
insert image description here

The average score is less than or equal to 100 and greater than or equal to 80 points, less than 80 points but greater than or equal to 70 points, less than 70 points but greater than or equal to 60 points, and less than 60 points for rating.
awkRating.awkThe content inside is as follows:

{
    
    
   sum = 0;
# 算出来所有用户的总成绩
   for(col = 2;col<=NF;col++){
    
    
      sum += $col;
   }
# 每行里边还有用户名,所以把字段个数减去1
   average[$1] = sum/(NF-1)
}
END{
    
    
# 进行评级
   for(user in average){
    
    
     if(average[user] <= 1000 && average[user] >= 80){
    
    
         rating = "A"
     }else if(average[user] < 80 && average[user] >= 70){
    
    
         rating = "B"
     }else if(average[user] < 70 && average[user] >= 60){
    
    
         rating = "C"
     }else{
    
    
         rating = "D"
     }
# 输出用户名,平均成绩和等级
     print user,average[user],rating
   }
}

awk -f awkRating.awk scoreArray.txt, execute to get the final result.
insert image description here
You can also count the numbers of A, B, Cand D.
awkRatingNumber.awkThe content inside is as follows:

{
    
    
   sum = 0;
# 算出来所有用户的总成绩
   for(col = 2;col<=NF;col++){
    
    
      sum += $col;
   }
# 每行里边还有用户名,所以把字段个数减去1
   average[$1] = sum/(NF-1)
}
END{
    
    
# 进行评级
   for(user in average){
    
    
     if(average[user] <= 1000 && average[user] >= 80){
    
    
         rating = "A"
     }else if(average[user] < 80 && average[user] >= 70){
    
    
         rating = "B"
     }else if(average[user] < 70 && average[user] >= 60){
    
    
         rating = "C"
     }else{
    
    
         rating = "D"
     }
# 输出用户名,平均成绩和等级
     print user,average[user],rating
# 统计等级数量
     ratingNumbers[rating]++
   }
# 输出等级数量
   for(rating in ratingNumbers){
    
    
     print rating,ratingNumbers[rating]
   }
}

awk -f awkRatingNumber.awk scoreArray.txtimplement.
insert image description here

This article is a study note for Day 13 in August, and the content comes from "100 Lectures on Linux Practical Skills" by Geek Time .

Guess you like

Origin blog.csdn.net/qq_42108074/article/details/132258625