bash - 如何将一行的第一部分保存在列表/数组中,然后根据第二部分对它们进行排序?
问题描述
我有一个学校项目,在这样的文本中给了我几行字符串:
- 团队1-团队2:2-1
- 团队3-团队1:2-2
- ETC
它希望我确定哪支球队获胜(或平局),然后与他们制作一个联赛表,为获胜/平局奖励积分。
这是我第一次使用 bash。我所做的是将 team1/team2 名称保存在变量中,然后对目标执行相同操作。我应该怎么做桌子?我设法让我的脚本创建了一个新文件,其中保存了所有团队名称(并检查没有重复),但我不知道如何继续。我应该为每个团队制作一个数组,在那里保存他们的结果吗?然后我如何实施排名,例如
- 团队1 3p
- 团队2 1p
- 等等
我不要求实际的代码,只是关于我应该如何实现它的指南。制作新文件是否正确?我应该尝试与团队一起制作一个新数组吗?或者是其他东西?
解决方案
问题可以分为3个部分:
- 以易于操作的格式将输入数据读入内存。
- 操作内存中的数据
- 以所需格式输出结果。
将数据读入内存时,您可能决定在操作之前一次性读取所有数据。或者您可能决定一次读取一行输入数据,并在读取每一行时对其进行操作。在使用 shell 脚本语言(如 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
推荐阅读
- javascript - 如何创建一个在没有 jquery 的情况下触发另一个事件的事件?
- php - 如何在 PHP 中搜索 JSON 记录?
- python - 如何根据连续属性对类的对象进行分组?
- python - 如何计算熊猫中两个数据框之间每个月的相关性?
- javascript - MVC 将元素 id 和输入值传递给控制器操作
- azure - 如何区分 azure DevOps 构建管道中的分支触发器和计划触发器
- java - Java 原始包装类如何支持 Groovy 中的其他方法?
- reactjs - ReactJS - 在列表中的 UI 上显示 Firebase 存储中的所有文件
- google-apps-script - 通过 HTML 表单制作和发送电子邮件
- amazon-web-services - 如何使用 API-Gateway 作为服务代理直接调用 DynamoDB Scan API?