Starting from:

$25

COMP9044 - Week 02 - Laboratory Exercises - Solved

Before the lab you should re-read the relevant lecture slides and their accompanying examples.

 Create a new directory for this lab called lab02, change to this directory, and fetch the provided code for this week by running these commands:

$ mkdir lab02

$ cd lab02

$ 2041 fetch lab02
Or, if you're not working on CSE, you can download the provided code as a zip file or a tar file.

 

 

There is a template file named counting_classes_answers.txt which you must use to enter the answers for this exercise.

Download counting_classes_answers.txt, or copy it to your CSE account using the following command:

$ cp -n /web/cs2041/20T2/activities/counting_classes/counting_classes_answers.txt .  
The autotest scripts depend on the format of counting_classes_answers.txt so just add your answers don't otherwise change the file. In other words edit counting_classes_answers.txt:

gedit counting_classes_answers.txt &
The file classes.txt contains a list of CSE classes downloaded from myUNSW.

Download classes.txt, or copy it to your CSE account using the following command:

$ cp -n /web/cs2041/20T2/activities/counting_classes/classes.txt . 

 
. Write a shell pipeline to print how many classes there are. Hint: the output of the pipeline should be:

441 
. Write a shell pipeline to print how many different courses have classes. Hint: cut with the -f option will be useful here.

Hint: the output of the pipeline should be:

35 
. Write a shell pipeline which will print the course with the most classes (and no other courses) and how many classes are in this course.

Hint: the output of the pipeline should be:

     31 COMP1521 
. Write a shell pipeline that prints the room most frequently-used room by CSE classes and how often it is used. Don't include the CSE lab rooms.

Hint: the output of the pipeline should be:

     26 Quad 1042 
. Write a shell pipeline that prints the most common day and hour in the week for classes to start and how many classes start at that time.

Hint: cut has a -c option.

Hint: the output of the pipeline should be:

     20 Fri 11 
. Challenge: Write a shell pipeline that prints a list of the course codes (only) of COMP courses that run 2 or more classes of the same type starting at the same time on the same day (e.g. three tut-labs starting Monday at 10 00). Hint: this should be the output of your pipeline:

COMP1000 

COMP1511 

COMP1521 

COMP2041 

COMP2511 

COMP2521 

COMP3331 

COMP6441 

COMP6841 

COMP9044 

COMP9311 

COMP9313 

COMP9331 

COMP9417 
When you think your program is working, you can use autotest to run some simple 


 

 

Write a program digits.sh that reads from standard input and writes to standard output mapping all digit characters whose values are less than 5 into the character '<' and all digit characters whose values are greater than 5 into the character '>'. The digit character '5' should be left unchanged.

Sample Input Data
Corresponding Output
 

1 234 5 678 9 
 
 

< <<< 5 >>> > 
 
 

I can think of 100's of other things I'd rather be doing than these 3 questions 
 
 

I can think of <<<'s of other things I'd rather be doing than these < questions 
 
 

A line with lots of numbers: 

123456789123456789123456789 

A line with all zeroes 

000000000000000000000000000 

A line with blanks at the end 

1 2 3 
 
 

A line with lots of numbers: 

<<<<5>>>><<<<5>>>><<<<5>>>> 

A line with all zeroes 

<<<<<<<<<<<<<<<<<<<<<<<<<<< 

A line with blanks at the end 

< < < 
 
 

Input with absolutely 0 digits in it Well ... apart from that one ... 
 
 

Input with absolutely < digits in it Well ... apart from that one ... 
 
 

1 2 4 8 16 32 64 128 256 512 1024 

2048 4096 8192 16384 32768 65536 
 
 

< < < > <> << >< <<> <5> 5<< <<<< 

<<<> <<>> ><>< <><>< <<>>> >55<> 
 
Hint: tr can be used.

When you think your program is working, you can use autotest to run some simple automated tests:

$ 2041 autotest digits
Autotest Results
99% of 557 students who have autotested digits.sh so far, passed all autotest tests.   99% passed test 1 2 3 4 5

 give:

$ give cs2041 lab02_digits digits.sh


 

 

Write a shell script called echon.sh which given exactly two arguments, an integer n and a string, prints the string n times. For example:

./echon.sh 5 hello hello hello hello hello hello 

./echon.sh 0 nothing ./echon.sh 1 goodbye goodbye 
Your script should print exactly the error message below if it is not given exactly 2 arguments:

./echon.sh  

Usage: ./echon.sh <number of lines> <string> ./echon.sh 1 2 3 

Usage: ./echon.sh <number of lines> <string> 
Also get your script to print this error message if its first argument isn't a non-negative integer:

./echon.sh hello world 

./echon.sh: argument 1 must be a non-negative integer ./echon.sh -42 lines 

./echon.sh: argument 1 must be a non-negative integer 
Although its better practice to print your error messages to stderr its OK to print your error messages to stdout for this exercise.

Hint: you'll need to use the shell if, while and exit statements, shell arithmetic and the test command.

When you think your program is working, you can use autotest to run some simple automated tests:

$ 2041 autotest echon
Autotest Results
95% of 553 students who have autotested echon.sh so far, passed all autotest tests.

  99% passed test 1

100% passed test 2

 100% passed test 2

99% passed test 3 4 5 6

96% passed test 7

98% passed test 8


$ give cs2041 lab02_echon echon.sh


Write a shell script file_sizes.sh which prints the names of the files in the current directory splitting them into three categories: small, medium-sized and large. A file is considered small if it contains less than 10 lines, medium-sized if contains less than 100 lines, otherwise it is considered large.

Your script should always print exactly three lines of output. Files should be listed in alphabetic order on each line. Your shell-script should match character-for-character the output shown in the example below. Notice the creation of a separate direcory for testing and the use of the script from the last question to produce test files. You could also produce test files manually using an editor.

mkdir test cd test ../echon.sh 5 text >a

../echon.sh 505 text >bbb

../echon.sh 17 text >cc

../echon.sh 10 text >d

../echon.sh 1000 text >e ../echon.sh 0 text >empty ls -l total 24 

-rw-r--r-- 1 andrewt andrewt   25 Mar 24 10:37 a 

-rw-r--r-- 1 andrewt andrewt 2525 Mar 24 10:37 bbb 

-rw-r--r-- 1 andrewt andrewt   85 Mar 24 10:37 cc 

-rw-r--r-- 1 andrewt andrewt   50 Mar 24 10:37 d 

-rw-r--r-- 1 andrewt andrewt 5000 Mar 24 10:37 e 

-rw-r--r-- 1 andrewt andrewt    0 Mar 24 10:37 empty 

../file_sizes.sh  

Small files: a empty 

Medium-sized files: cc d Large files: bbb e rm cc d ../echon.sh 10000 . >lots_of_dots ls -l total 36 

-rw-r--r-- 1 andrewt andrewt    25 Mar 24 10:37 a 

-rw-r--r-- 1 andrewt andrewt  2525 Mar 24 10:37 bbb 

-rw-r--r-- 1 andrewt andrewt  5000 Mar 24 10:37 e 

-rw-r--r-- 1 andrewt andrewt     0 Mar 24 10:37 empty 

-rw-r--r-- 1 andrewt andrewt 20000 Mar 24 10:39 lots_of_dots 

../file_sizes.sh  Small files: a empty Medium-sized files: 

Large files: bbb e lots_of_dots 
Hint: you can use the command wc to discover how many lines are in a file. You probably want to use the shell's back quotes, its if statement, and the test command.

When you think your program is working, you can use autotest to run some simple automated tests:

$ 2041 autotest file_sizes
Autotest Results
98% of 527 students who have autotested file_sizes.sh so far, passed the autotest test.

When you are finished working on this exercise, you must submit your work by running give:

$ give cs2041 lab02_file_sizes file_sizes.sh
before Tuesday 16 June 17 59 to obtain the marks for this lab exercise.

 

 

Write a shell script scraping_courses.sh which prints a list of UNSW courses with the given prefix by extracting them from the 2018 UNSW handbook webpages.

This year UNSW has changed to much prettier format but also a format which it is much harder for a script to extract information from.

So for this exercise we'll use the 2018 handbook pages which aren't For example:


 

scraping_courses.sh OPTM 

OPTM2111 Optometry 2A 

OPTM2133 The Clinical Environment 

OPTM2190 Introduction to Clinical Optometry 

OPTM2211 Optometry 2B 

OPTM2233 Optical Dispensing 

OPTM2291 Primary Care Optometry 

OPTM3105 Disease Processes of the Eye 1 

OPTM3111 Optometry 3A 

OPTM3131 Ocular Disease 3A 

OPTM3133 Vision Science in the Consulting Room 

OPTM3201 Ocular Imaging & Applied Vision Science OPTM3205 Disease Processes of the Eye 2 

OPTM3211 Optometry 3B 

OPTM3231 Ocular Disease 3B 

OPTM3233 Working in the clinical environment 

OPTM4110 Optometry 4A 

OPTM4131 Clinical Optometry 4A 

OPTM4151 Ocular Therapeutics 4A 

OPTM4211 Optometry 4B 

OPTM4231 Clinical Optometry 4B 

OPTM4251 Ocular Therapeutics 4B 

OPTM4271 Professional Optometry 

OPTM4291 Optometry, Medicine & Patient Management 

OPTM5111 Clinical Optometry 5A 

OPTM5131 Specialist Clinical Optometry 5A 

OPTM5151 Clinical Ocular Therapeutics 5A 

OPTM5171 Research Project 5A 

OPTM5211 Clinical Optometry 5B 

OPTM5231 Specialist Clinical Optometry 5B 

OPTM5251 Clinical Ocular Therapeutics 5B OPTM5271 Research Project 5B 

OPTM6400 Optometric Preclinical Practice 

OPTM6411 Contact Lenses 

OPTM6412 Clinical Optometry 4A 

OPTM6413 Anterior Eye Therapeutics 

OPTM6421 Binocular Vision, Paediatrics and Low Vision 

OPTM6422 Clinical Optometry 4B 

OPTM6423 Therapeutics and the Posterior Eye 

OPTM6424 Professional Optometry 

OPTM7001 Introduction to Community Eye Health 

OPTM7002 Epidemiology & Biostatistics for Needs Assessment 

OPTM7003 Epidemiology of Blinding Eye Diseases 

OPTM7004 Advocacy and Education in Community Eye Health OPTM7005 Eye Health Economics and Sustainability 

OPTM7006 Eye Care Program Management 

OPTM7007 Community Eye Health Project 

OPTM7103 Behavioural Optometry 1 

OPTM7104 Advanced Contact Lens Studies 1 

OPTM7108 Research Skills in Optometry 

OPTM7110 Public Health Optometry 

OPTM7115 Visual Neuroscience 

OPTM7117 Ocular Therapy 2 

OPTM7203 Behavioural Optometry 2 OPTM7205 Specialty Contact Lens Studies 

OPTM7213 Ocular Therapy 

OPTM7301 Advanced Clinical Optometry 

OPTM7302 Evidence Based Optometry 

OPTM7308 Research Project 

OPTM7444 Business Skills in Optometry 

OPTM7511 Advanced Ocular Disease 1 

OPTM7521 Advanced Ocular Disease 2 

OPTM8511 Clinical paediatrics, low vision and colour vision 

OPTM8512 Clinical Optometry 5A 

OPTM8513 Clinical Ocular Therapy 5A 

OPTM8518 Optometry Research Project A 

OPTM8521 Clinical Contact Lenses 

OPTM8522 Clinical Optometry 5B 

OPTM8523 Clinical Ocular Therapy 5B OPTM8528 Optometry Research Project B scraping_courses.sh MATH|wc 
    126     585    4874 

scraping_courses.sh COMP|grep Soft 

COMP1531 Software Engineering Fundamentals 

COMP2041 Software Construction: Techniques and Tools 

COMP3141 Software System Design and Implementation 

COMP3431 Robotic Software Architecture 

COMP4161 Advanced Topics in Software Verification 

COMP4181 Language-based Software Safety 

COMP6447 System and Software Security Assessment 

COMP9041 Software Construction: Techniques and Tools 

COMP9181 Language-based Software Safety COMP9322 Software Service Design and Engineering 

COMP9323 Software as a Service Project COMP9431 Robotic Software Architecture scraping_courses.sh MINE|grep Rock 

MINE3630 Rock Breakage 

MINE8640 Geotechnical Hazards in Hard Rock Mines 

MINE8660 Geotechnical Engineering for Underground Hard Rock 
Your script must download the handbook web pages and extract the information from them when it is run.

Hints
This task can be done using the usual tools of egrep, sed, sort & uniq but the regular expressions take some thought.

The UNSW handbook uses seperate web pages for undergraduate and postgraduate courses. These two web pages would need to be downloaded for the above example (OPTM):

http://legacy.handbook.unsw.edu.au/vbook2018/brCoursesByAtoZ.jsp?StudyLevel=Undergraduate&descr=O and http://legacy.handbook.unsw.edu.au/vbook2018/brCoursesByAtoZ.jsp?StudyLevel=Postgraduate&descr=O. Make sure courses which occur in both postgraduate & undergraduate handbooks aren't repeated. cat -A can be useful to check for non-printing characters.

The command curl will download a URL and print it to standard output.

In a script it is best run as curl --silent so it doesn't print extra information on standard error.

For example:

curl --silent "http://legacy.handbook.unsw.edu.au/vbook2018/brCoursesByAtoZ.jsp?

StudyLevel=Undergraduate&descr=O"|grep OPTM 

                                <TD class="" align="left">OPTM2111</TD> 

                                <TD class=""><A href="http://www.handbook.unsw.edu.au/undergraduate/courses/2018/OPTM2111.html">Optometry 2A</A></TD> 

                                <TD class="evenTableCell" align="left">OPTM2133</TD> 

                                <TD class="evenTableCell"><A 

href="http://www.handbook.unsw.edu.au/undergraduate/courses/2018/OPTM2133.html">The Clinical Environment </A> </TD> 

                                <TD class="" align="left">OPTM2190</TD> 

                                <TD class=""><A 

href="http://www.handbook.unsw.edu.au/undergraduate/courses/2018/OPTM2190.html">Introduction to Clinical Optometry </A></TD> 

                                <TD class="evenTableCell" align="left">OPTM2211</TD> 

                                <TD class="evenTableCell"><A href="http://www.handbook.unsw.edu.au/undergraduate/courses/2018/OPTM2211.html">Optometry 2B</A></TD>                                 <TD class="" align="left">OPTM2233</TD> 

                                <TD class=""><A href="http://www.handbook.unsw.edu.au/undergraduate/courses/2018/OPTM2233.html">Optical Dispensing </A></TD> ... 
The program wget can be used for the same purpose, by running it as wget -q -O- url

When you think your program is working, you can use autotest to run some simple automated tests:


More products