Calculate average from a given set of keys and values


 
Thread Tools Search this Thread
Top Forums UNIX for Beginners Questions & Answers Calculate average from a given set of keys and values
# 1  
Old 08-15-2019
Calculate average from a given set of keys and values

Hello,
I am writing a script which expects as its input a hash with student names as the keys and marks as the values. The script then returns array of average marks for student scored 60-70, 70-80, and over 90.


Output expected


Code:
50-70    1
70-90    3
over 90   0

The test script so far I have written looks like this


Code:
#!/bin/bash

ARRAY=( "ABC:60"
        "DEF:70"
        "GHI:75"
        "JKL:80" )

for student in "${ARRAY[@]}" ; do
    KEY="${student%%:*}"
    VALUE="${student##*:}"
    printf "%s's marks is %s.\n" "$KEY" "$VALUE"


done

I am able to store the input as hash with keys and its values but not able to calculate the average and give the output as expected. Any suggestions would be appreciated.


thank you

Last edited by nans; 08-15-2019 at 11:12 AM..
# 2  
Old 08-15-2019
Change for students to for student then you can continue writing script to calculate averages.

Last edited by rdrtx1; 02-18-2020 at 08:30 PM..
# 3  
Old 08-15-2019
Apologies, that was a typo, when formatting the thread
# 4  
Old 08-15-2019
The script posted and output don't show any average calculation. Grades range total maybe.
An ex.:
Code:
#!/bin/bash

ARRAY=( "ABC:60"
"DEF:70"
"GHI:75"
"JKL:80" )

declare -a scores=("1000-90" "90-80" "80-70" "70-60" "60-50" "50-0")
declare -a ranges=("over 90" "90-80" "80-70" "70-60" "60-50" "under 50")
declare -A totals

for student in "${ARRAY[@]}" ; do
KEY="${student%%:*}"
VALUE="${student##*:}"
printf "%s's marks is %s.\n" "$KEY" "$VALUE"
c=0;
for i in "${scores[@]}" ; do
if [[ $VALUE -ge ${i##*-} ]] && [[ $VALUE -le ${i%%-*} ]] ; then
(( totals[${ranges[$c]}] = totals[${ranges[$c]}] + 1 ))
fi
(( c = c + 1 ))
done
done

for s in "${ranges[@]}"
do
printf "%-10s %d\n" "$s" ${totals["$s"]}
done


Last edited by rdrtx1; 02-18-2020 at 08:30 PM..
# 5  
Old 08-26-2019
This smells a bit like homework/coursework, but after a week here is another example:
Code:
#!/bin/bash
ARRAY=( "ABC:60"
        "DEF:70"
        "GHI:75"
        "JKL:80" )

RANGES=( "-50" "50-70" "70-90" "90-" )

for student in "${ARRAY[@]}" ; do
    KEY="${student%%:*}"
    VALUE="${student##*:}"
    printf "%s's marks is %s.\n" "$KEY" "$VALUE"
    for ((cnt=0; cnt < ${#RANGES[@]}; cnt++)) ; do
        leftr=${RANGES[cnt]%-*}
        rightr=${RANGES[cnt]#*-}
        [ -z "$leftr" ] && leftr=0
        [ -z "$rightr" ] && rightr=999
        if [ $VALUE -ge $leftr ] && [ $VALUE -lt $rightr ] ; then
            ((COUNTS[cnt]++))
        fi
    done
done
# note: COUNTS[] was not preset, so elements with 0 are missing
# but printf "%d" will cast "" to 0
for ((cnt=0; cnt < ${#RANGES[@]}; cnt++)) ; do
    printf "%-10s %d\n" "${RANGES[cnt]}" "${COUNTS[cnt]}"
done

Output:
Code:
ABC's marks is 60.
DEF's marks is 70.
GHI's marks is 75.
JKL's marks is 80.
-50        0
50-70      1
70-90      3
90-        0


Last edited by MadeInGermany; 08-26-2019 at 03:13 PM.. Reason: the output loop was missing
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Calculate the average per block.

My old school way is a one liner. And will search for average from SAR, to get the data receive rate. But, I dont think it is practical or accurate,. Because it calculates to off peak hours. I am planning to change it. My cron runs every 30 mins. When my cron runs, and my time is 14:47pm,, it will... (1 Reply)
Discussion started by: invinzin21
1 Replies

2. Shell Programming and Scripting

Calculate average, azimut and distance

Gents, Please i will to get the distance and azimut from 2 coordinates: Usig excel formula i get the correct values, but i will like to do it using awk. Example A 35089.0 50345.016 9 75 1 2101774 77 70 79 483911.6 2380106.9 137.4 1 1 6 1 A 35089.0 50345.01620 75... (8 Replies)
Discussion started by: jiam912
8 Replies

3. Shell Programming and Scripting

Calculate Average time of one column

Hello dears, I have a log file with records like below and want to get a average of one column based on the search of one specific keyword. 2015-02-07 08:15:28 10.102.51.100 10.112.55.101 "kevin.c" POST ... (2 Replies)
Discussion started by: Newman
2 Replies

4. Shell Programming and Scripting

Calculate average of top n% of values - UNIX

Hey guys, I have several huge tab delimited files which look like this: a 1 20 a 3 15 a 5 10 b 2 15 b 6 10 c 3 23 what I am interested is to calculate the average of top n% of data in third column. So for example for this file the top 50% values are: 23 20 (Please note that it... (11 Replies)
Discussion started by: @man
11 Replies

5. UNIX for Dummies Questions & Answers

Average for multiple keys

Hi, I want to find row-wise average of multiple columns based on 2 columns. I have 30k values in the matrix with 94 cols. Example Input for cols 4 and 5 as keys 1 2 3 a 1 4 5 6 a 1 4 2 0 a 1 1 2 3 b 2 5 6 7 b 2 9 7 5 b 2 Output 3 3 3 a 1 5 5 5 b 2Here is what I have tried,... (5 Replies)
Discussion started by: ritakadm
5 Replies

6. Shell Programming and Scripting

Calculate Average AWK

I want to calculate the average line by line of some files with several lines on them, the files are identical, just want to average the 3rd columns of those files.:wall: Example file: File 1 001 0.046 0.667267 001 0.047 0.672028 001 0.048 0.656025 001 0.049 ... (2 Replies)
Discussion started by: AriasFco
2 Replies

7. Shell Programming and Scripting

AWK novice - calculate the average

Hi, I have the following data in a file for example: P1 XXXXXXX.1 YYYYYYY.1 ZZZ.1 P1 XXXXXXX.2 YYYYYYY.2 ZZZ.2 P1 XXXXXXX.3 YYYYYYY.3 ZZZ.3 P1 XXXXXXX.4 YYYYYYY.4 ZZZ.4 P1 XXXXXXX.5 YYYYYYY.5 ZZZ.5 P1 XXXXXXX.6 YYYYYYY.6 ZZZ.6 P1 XXXXXXX.7 YYYYYYY.7 ZZZ.7 P1 XXXXXXX.8 YYYYYYY.8 ZZZ.8 P2... (6 Replies)
Discussion started by: alex2005
6 Replies

8. Shell Programming and Scripting

Calculate average time using a script

Hello, I'm hoping to get some help on calculating an average time from a list of times (hour:minute:second). Here's what my list looks like right now, it will grow (I can get the full date or change the formatting of this as well): 07:55:31 09:42:00 08:09:02 09:15:23 09:27:45 09:49:26... (4 Replies)
Discussion started by: jaredhanks
4 Replies

9. Programming

calculate average

I have a file which is 2 3 4 5 6 6 so i am writing program in C to calculate mean.. #include<stdio.h> #include<string.h> #include <math.h> double CALL mean(int n , double x) main (int argc, char **argv) { char Buf,SEQ; int i; double result = 0; FILE *fp; (3 Replies)
Discussion started by: cdfd123
3 Replies

10. UNIX for Dummies Questions & Answers

calculate average of column 2

Hi I have fakebook.csv as following: F1(current date) F2(popularity) F3(name of book) F4(release date of book) 2006-06-21,6860,"Harry Potter",2006-12-31 2006-06-22,,"Harry Potter",2006-12-31 2006-06-23,7120,"Harry Potter",2006-12-31 2006-06-24,,"Harry Potter",2006-12-31... (0 Replies)
Discussion started by: onthetopo
0 Replies
Login or Register to Ask a Question