bisba
bisba

Reputation: 11

How can i save in a list/array first parts of a line and then sort them depending on the second part?

I have a school project that gives me several lines of string in a text like this:

it wants me to determine what team won (or drew) and then make a league table with them, awarding points for wins/draws.

this is my first time using bash. what i did was save team1/team2 names in a variable and then do the same for goals. how should i make the table? i managed to make my script create a new file that saves in there all team names (And checking for no duplicates) but i dont know how to continue. should i make an array for each team saving in there their results? and then how do i implement the rankings, for example

im not asking for actual code, just a guide as to how i should implement it. is making a new file the right move? should i try making a new array with the teams instead? or something else?

Upvotes: 1

Views: 48

Answers (2)

Andrew Vickers
Andrew Vickers

Reputation: 2654

The problem can be divided into 3 parts:

  1. Read the input data into memory in a format that can be manipulated easily.
  2. Manipulate the data in memory
  3. Output the results in the desired format.

When reading the data into memory, you might decide to read all the data in one go before manipulating it. Or you might decide to read the input data one line at a time and manipulate each line as it is read. When using shell scripting languages, like bash, the second option usually results in simpler code.

The most important decision to make here is how you want to structure the data in memory. You normally want to avoid duplication of data, and you usually want a data structure that is easy to transform into your desired output. In this case, the most logical data structure is an associative array, using the team name as the key.

Assuming that you have to use bash, here is a framework for you to build upon:

#!/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

Upvotes: 2

Corentin Limier
Corentin Limier

Reputation: 5006

I would use awk for this

AWK is an interpreted programming language(AWK stands for Aho, Weinberger, Kernighan) designed for text processing and typically used as a data extraction and reporting tool. AWK is used largely with Unix systems.

Using pure bash scripting is often messy for that kind of jobs.

Let me show you how easy it can be using awk

Input file : scores.txt

team1-team2:2-1
team3-team1:2-2

Code :

awk -F'[:-]' ' # set delimiters to ':' or '-'
    {
        if($3>$4){teams[$1] += 3} # first team gets 3 points
        else if ($3<$4){teams[$2] += 3} # second team gets 3 points
        else {teams[$1]+=1; teams[$2]+=1} # both teams get 1 point
    }
    END{ # after scanning input file
        for(team in teams){
            print(team OFS teams[team]) # print total points per team
        }
    }' scores.txt | sort -rnk 2 > ranking.txt # sort by nb of points

Output (ranking.txt):

team1 4
team3 1

Upvotes: 1

Related Questions