首页 > 解决方案 > 如何将一行的第一部分保存在列表/数组中,然后根据第二部分对它们进行排序?

问题描述

我有一个学校项目,在这样的文本中给了我几行字符串:

它希望我确定哪支球队获胜(或平局),然后与他们制作一个联赛表,为获胜/平局奖励积分。

这是我第一次使用 bash。我所做的是将 team1/team2 名称保存在变量中,然后对目标执行相同操作。我应该怎么做桌子?我设法让我的脚本创建了一个新文件,其中保存了所有团队名称(并检查没有重复),但我不知道如何继续。我应该为每个团队制作一个数组,在那里保存他们的结果吗?然后我如何实施排名,例如

我不要求实际的代码,只是关于我应该如何实现它的指南。制作新文件是否正确?我应该尝试与团队一起制作一个新数组吗?或者是其他东西?

标签: bash

解决方案


问题可以分为3个部分:

  1. 以易于操作的格式将输入数据读入内存。
  2. 操作内存中的数据
  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

推荐阅读