Mathematical and Physical Journal
for High Schools
Issued by the MATFUND Foundation
Already signed up?
New to KöMaL?

Problem I. 225. (November 2009)

I. 225. In this task you will familiarize yourself with the awk programming language, a tool for processing text files quickly and efficiently.

The file match.txt contains results of some football matches, one match per each line: name of the home team, name of the visitor team, goals scored by the home team, goals scored by the visitors. (Pieces of data in the file are separated by single spaces.)

The following tasks should be solved in awk.

1. Create a list of matches by using the following format:\ Team Alpha -- Team Beta: 1--2 (In this exercise, all results should be displayed similarly.)

2. Create a list of matches played by Team Gamma.

3. Display matches when Team Delta won at home.

4. Give the number of matches in the file.

5. Display the largest difference in goals of all matches when visitors won.

6. Compute the total number of points scored by Team Alpha at home. (A win is 3 points, a draw is 1 point.)

7. Create a statistic showing how many times each result occurred. You can assume that no team scored more than 9 goals. (Results should be displayed from the viewpoint of the home team.)

1 point can be awarded for the correct solution of each of the first four tasks, while other tasks are worth 2 points each.

The following command for example displays the total number of goals during all matches

awk "BEGIN { ossz=0 }{ ossz+=($3+$4) } END { print ossz }" meccs.txt

The above command works under Windows; under Linux some modification of the limiting symbols may be necessary.

A description of awk (in Hungarian) can be found at http://hup.hu/old/gawk/tobb/gawk_toc.html.

Your file i225.txt should be submitted containing answers to the above questions (separated clearly in a readable format), moreover, the name of the operating system and the actual version number of awk.

meccs.txt

(10 pont)

Deadline expired on December 10, 2009.


Sorry, the solution is available only in Hungarian. Google translation

A feladatban megnevezett eszközt igen hatékonyan tudják használni azok, akik komolyabban foglalkoznak informatikával. A feladat könnyen érthető példák segítségével igyekezett a KöMaL megoldóit bevezetni a használat rejtelmeibe.

Meglepő volt, hogy a megoldók fele Linux operációs rendszert használt (Ubuntu és Debian) és csak a fele dolgozott Microsoft operációs rendszer (XP) alatt.

Néhány feladat megoldása szinte betűről-betűre egyezett a feladat kitűzésekor kigondolttal, de esetenként voltak jelentősen eltérő megoldások is.

Az első három feladatban azt kellett kihasználnunk, hogy az awk program a bemeneti fájl minden sorát feldolgozza pontosan ugyanúgy, mintha egy "hétköznapi" programozási nyelvben ilyen céllal egy ciklust írnánk. A sorban található adatokat egy megadott határolójel mentén (alapértelmezésben szóköz) felbont és az adatokat egy-egy változóban helyezi el. $i a sorbeli i-edik változót tárolja. Ezen ismereten túl még az elágazásra volt szükség, amelyet a C-szerű nyelvekben megszokott formában lehetett alkalmazni.

1. Készítsük el a mérkőzések listáját a következő minta szerint: Alfa - Béta: 1-2

Megoldás:

awk "{ print $1 \" - \" $2 \" : \" $3 \" - \" $4 }" meccs.txt

2. Listázzuk ki a Gamma csapat mérkőzéseit.

Megoldás:

awk "{ if($1==\"Gamma\" || $2==\"Gamma\" ) {print $1 \" - \" $2 \" : \" $3 \"-\" $4 } }" meccs.txt

3. Listázzuk ki a Delta csapat otthoni győztes mérkőzéseit.

Megoldás:

awk "{ if($1==\"Delta\" && $3>$4 ) {print $1 \" - \" $2 \" : \" $3 \"-\" $4 } }" meccs.txt

A további feladatok megoldásához több ismeretre van szükség. A BEGIN mögött megfogalmazott utasításrész csak egyszer, még a fájl feldolgozása előtt, az END után írt utasításrész pedig a fájl feldolgozását követően kerül végrehajtásra. Előbbi a kezdőértékek megadására, utóbbi az eredmény egyszeri megjelenítésére teszi alkalmassá az eszközt.

4. Adjuk meg, hány mérkőzést tartalmaz az állomány.

Megoldás:

awk "END { print NR }" meccs.txt

A helyi változók használata nagyon egyszerűvé teszi az alábbi szélsőértékmeghatározást.

5. Adjuk meg, mekkora volt a legnagyobb különbségű vendéggyőzelem.

Megoldás:

awk "BEGIN { max=0 } { if ($4-$3>max){ max=$4-$3 } } END {print max} " meccs.txt

6. Számítsuk ki az Alfa otthon szerzett pontszámát! (A győzelemért 3, a döntetlenért 1 pont jár.)

Megoldás:

awk "BEGIN { pont=0 } { if ($1==\"Alfa\"){ if($3>$4){ pont+=3} if($3==$4){ pont+=1}} } END {print pont} " meccs.txt

A tömb adatszerkezet is a megszokott módon használható.

Az aktuális feladatnál azért volt szükség a szerzett gólokra vonatkozóan határt szabni, hogy egyszerű számlálásos ciklussal meg lehessen jeleníteni az eredményt.

7. Készítsünk statisztikát, amely kilistázza, hogy melyik eredmény hányszor fordult elő! Feltételezhető, hogy egyetlen csapat sem szerzett 9 gólnál többet. (Az eredményt a hazai csapat szemszögéből kell vizsgálni.)

Megoldás:

awk "{ e[$3,$4]++ } END {for (i=0; i<10; i++) { for (j=0; j<10; j++) { if (e[i,j]>0) {print i \"-\" j \" : \" e[i,j] \" darab\"} } } }" meccs.txt


Statistics:

6 students sent a solution.
10 points:Balla Attila, Nagy 111 Miklós, Szabó 928 Attila.
9 points:Pap 999 Dávid.
8 points:1 student.
6 points:1 student.

Problems in Information Technology of KöMaL, November 2009