У меня есть 2 следующих файла:
очков:
John,12
Joseph,14
Madison,15
Elijah,14
Theodore,15
Regina,18
команд:
Theodore,team1
Elijah,team2
Madison,team1
Joseph,team3
Regina,team2
John,team3
Я хотел бы рассчитать средние очки каждой команды.Я придумал решение, используя только 2 awk
утверждений.Но я хотел бы сделать это более эффективным способом (без использования for
циклов и if
операторов).
Вот что я сделал:
#!/bin/bash
awk 'BEGIN { FS="," }
FNR==NR { a[FNR] = $1; b[FNR] = $2; next } { for(i = 0; i <= NR; ++i) { if(a[i] == $1) print b[i], $2 } }' teams points > output.txt
В этом первомawk
команда, я отделяю команды (team1, team2, team3) от имен и создаю новый файл, содержащий только мои команды и соответствующие очки для каждой команды (и поэтому необходимо использовать for loop
и if statement
).
Во-вторых:
awk 'BEGIN { FS=" ";
count_team1 = 0;
count_team2 = 0;
count_team3 = 0
average_team1 = 0;
average_team2 = 0;
average_team3 = 0 }
/team1/ { count_team1 = count_team1 + 1; average_team1 = average_team1 + $2 }
/team2/ { count_team2 = count_team2 + 1; average_team2 = average_team2 + $2 }
/team3/ { count_team3 = count_team3 + 1; average_team3 = average_team3 + $2 }
END { print "The average of team1 is: " average_team1 / count_team1;
print "The average of team2 is: " average_team2 / count_team2;
print "The average of team3 is: " average_team3 / count_team3 }' output.txt
В этой второй команде awk
я просто создаю переменные для хранения количества членов каждой команды и других переменных, чтобы иметьОбщее количество очков каждой команды.Это легко сделать, поскольку мой новый файл output.txt
содержит только команды и результаты.
Это решение работает, но, как я уже говорил, я бы хотел сделать это без использования цикла for
иif
заявление.Я думал не использовать FNR==NR
и использовать grep -f
для сопоставления, но я не получил никаких окончательных результатов.