Hey there people on the internet. Here's my solution for Awk - 3 https://blog.shasec.rocks/post/hackerrank-bash-challs. So let's get started. 

Challenge

> An Introduction to 'awk'

There are a lot of quick tricks which may be accomplished with the 'awk' interpreter. Among other things, awk may be used for a lot of text-munging and data-processing tasks which require some quick scripting work.

Examples with awk

Print Examples

Conditionals with Awk

> Task

You are provided a file with four space-separated columns containing the scores of students in three subjects. The first column, contains a single character (A-Z) - the identifier of the student. The next three columns have three numbers (each between 0 and 100, both inclusive) which are the scores of the students in English, Mathematics and Science respectively.

Your task is to identify the performance grade for each student. If the average of the three scores is 80 or more, the grade is 'A'.

If the average is 60 or above, but less than 80, the grade is 'B'. If the average is 50 or above, but less than 60, the grade is 'C'. Otherwise the grade is 'FAIL'.

> Input Format

There will be no more than 10 rows of data.

Each line will be in the following format:

[Identifier][English Score][Math Score][Science Score]

> Output Format

For each row of data, append a space, a colon, followed by another space, and the grade. Observe the format showed in the sample output.

> Sample Input

A 25 27 50
B 35 37 75
C 75 78 80
D 99 88 76

> Sample Output

A 25 27 50 : FAIL
B 35 37 75 : FAIL
C 75 78 80 : B
D 99 88 76 : A

> Explanation

A scored an average less than 50 => FAIL Same for B C scored an average between 60 and 80 => B

D scored an average between 80 and 90 => A

Solution

Have a look at these Awk Examples. Might be useful.

Blog Image
Figure 1.0: Use the -v option to bring a variable outside the awk script 

The idea is to get input line by line and calculate the average. Here is my solution:

#!/bin/bash

while read line || [ -n "$line" ]; do

    englishMarks=$(echo $line | awk '{ print $2 }')
    mathsMarks=$(echo $line | awk '{ print $3 }')
    scienceMarks=$(echo $line | awk '{ print $4 }')
    
    avgTotMarks=$(( ($englishMarks + $mathsMarks + $scienceMarks) / 3 ))
    
    echo $line | awk -v avg=$avgTotMarks '{
        if ( avg>=80 )
            print $1,$2,$3,$4,": A"
        
        else if ( avg>=60 && avg<80 )
            print $1,$2,$3,$4,": B"

        else if ( avg>=50 && avg<60 )
            print $1,$2,$3,$4,": C"

        else
            print $1,$2,$3,$4,": FAIL"
    }'

done
Blog Image
Figure 1.1: Solution passed all HackerRank tests cases

If you like content like this, please consider buying me a coffee.

Thank you for your support :)


👇 Share this post 👇


💬 Comment Section 💬