Проблема может быть разделена на 3 части:
- Считывание входных данных в память в формате, которым легко манипулировать.
- Манипулирование данными в памяти
- Вывод результатов в нужном формате.
При чтении данных в память, вы можете решить прочитать все данные за один раз, прежде чем манипулировать ими. Или вы можете решить читать входные данные по одной строке за раз и манипулировать каждой строкой во время чтения. При использовании языков сценариев оболочки, таких как bash, второй вариант обычно приводит к более простому коду.
Самое важное решение, которое необходимо принять, - это то, как вы хотите структурировать данные в памяти. Обычно вы хотите избежать дублирования данных и, как правило, хотите, чтобы структура данных была легко преобразована в желаемый результат. В этом случае наиболее логичной структурой данных является ассоциативный массив, использующий имя команды в качестве ключа.
Предполагая, что вам нужно использовать bash, вот структура, на которую вы можете опираться:
#!/bin/bash
declare -A results
while IFS=':-' read team1 team2 score1 score2; do
if [ ${score1} -gt ${score2} ]; then
((results[${team1}]+=2))
elif [ ...next test... ]; then
...
else
...
fi
done < scores.txt
# Now you have an associative array containing the points for each team.
# You can either output it as it stands, or sort it by piping through the
# 'sort' command.
for key in $[!results[@]}; do
echo ...
done