Calculate the performance of employee


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Calculate the performance of employee
# 8  
Old 08-09-2019
Agree to that, But would more keen on bash scripting for learning purpose
# 9  
Old 08-09-2019
Quote:
Originally Posted by rohit_shinez
Agree to that, But would more keen on bash scripting for learning purpose
I have already stated that bash ONLY has integer maths, so let's see its limitations:
Code:
q1=6; q2=7; q3=5; q4=7
av1=$(( (q1+q2+q3+q4)/4 ))
echo "$av1"
# Gives the result 6. WRONG! The REAL answer is 6.25.

(<CR> is the ENTER key.)
Try this example in bash: echo $(( 3/4 ))<CR> and see the result as 0, ZERO, NOT 0.75!
Now try this in bash: NUM=$(( 3/4 )); if [ "${NUM}" -le "0.75" ]; then echo "True!"; else echo "False!"; fi<CR>
Do you see where the next step goes?
Utilities are needed for any floating point requirements.
Now try this utility, which I guess you already have: NUM=$( python -c "print(3.0/4.0)" ); echo "${NUM}"<CR> ; yes this works on Python 2.x.x and 3.x.x.
You now have your floating point number - BUT - how do you compare knowing there is an error report saying:
-bash: [: 0.75: integer expression expected ...
Now ksh is a different animal, similar to bash but has full floating point and integer maths capability and with a little work can create something like this little beauty:
DFT using pure ksh ONLY!

Last edited by wisecracker; 08-09-2019 at 04:24 PM.. Reason: Correct error report...
# 10  
Old 08-10-2019
Thanks for the inputs, In python is there a way to make it effective code or any other alternative approach
# 11  
Old 08-11-2019
Here you go in bash, this REQUIRES integer number input for salary:
You will have to work out how to use floating point for input, it would be tedious but a draft so far...

Code:
#!/bin/bash

: > /tmp/salary.txt
echo 'EMPNAME | SALARY | Q1 | Q2 | Q3 | Q4 | Avg Q | Expected Sal | Incremented Sal | Performance |' > /tmp/salary.txt
while :
do
    printf "Enter employee name, QUIT or EXIT to finish:- "; read -r name
    if [ "${name}" = "QUIT" ] || [ "${name}" = "EXIT" ]
    then
        echo "Finalising file inside '/tmp/salary.txt'!"
        break
    fi
    printf "Enter employee salary:- "; read -r salary
    printf "Enter Q1:- "; read -r q1
    printf "Enter Q2:- "; read -r q2
    printf "Enter Q3:- "; read -r q3
    printf "Enter Q4:- "; read -r q4
    # Multiply all inputted INTEGER ONLY values by 100!
    salary=$(( salary*100 ))
    q1=$(( q1*100 ))
    q2=$(( q2*100 ))
    q3=$(( q3*100 ))
    q4=$(( q4*100 ))
    avg=$(( (q1+q2+q3+q4)/4 ))
    av=$(( (salary*avg) ))
    inc_salary=$(( (salary*av) ))
    exp_salary=$(( (salary+av) ))
    if [ "${avg}" -gt "700" ]
    then
        desc="BEST"
    fi
    if [ "${avg}" -le "700" ] && [ "${avg}" -ge "500" ]
    then
        desc="AVG"
    fi
    if [ "${avg}" -lt "500" ]
    then
        desc="ON TRACK"
    fi

    avg_str=$( printf "%.2f" "$(( avg ))e-2" )
    av_str=$( printf "%.2f" "$(( salary*avg ))e-6" )
    inc_salary_str=$( printf "%.2f" "$(( inc_salary ))e-12" )
    exp_salary_str=$( printf "%.2f" "$(( (salary*10000)+av ))e-6" )
    echo "$name | $(( salary/100 )) | $(( q1/100 )) | $(( q2/100 )) | $(( q3/100 )) | $(( q4/100 )) | ${avg_str} | ${exp_salary_str} | ${av_str} | ${desc} |"
    echo "$name | $(( salary/100 )) | $(( q1/100 )) | $(( q2/100 )) | $(( q3/100 )) | $(( q4/100 )) | ${avg_str} | ${exp_salary_str} | ${av_str} | ${desc} |" >> /tmp/salary.txt
done
clear
cat /tmp/salary.txt
exit 0

Results OSX 10.14.3, defaault bash terminal...
Code:
Enter employee name, QUIT or EXIT to finish:- Dave
Enter employee salary:- 11377
Enter Q1:- 3
Enter Q2:- 4
Enter Q3:- 5
Enter Q4:- 6
Dave | 11377 | 3 | 4 | 5 | 6 | 4.50 | 11888.96 | 511.96 | ON TRACK |
Enter employee name, QUIT or EXIT to finish:- Baz
Enter employee salary:- 12347
Enter Q1:- 6
Enter Q2:- 7
Enter Q3:- 6
Enter Q4:- 7
Baz | 12347 | 6 | 7 | 6 | 7 | 6.50 | 13149.55 | 802.55 | AVG |
Enter employee name, QUIT or EXIT to finish:- Tamsan
Enter employee salary:- 15678
Enter Q1:- 6
Enter Q2:- 7
Enter Q3:- 8
Enter Q4:- 8
Tamsan | 15678 | 6 | 7 | 8 | 8 | 7.25 | 16814.65 | 1136.66 | BEST |
Enter employee name, QUIT or EXIT to finish:- QUIT
Finalising file inside '/tmp/salary.txt'!

EMPNAME | SALARY | Q1 | Q2 | Q3 | Q4 | Avg Q | Expected Sal | Incremented Sal | Performance |
Dave | 11377 | 3 | 4 | 5 | 6 | 4.50 | 11888.96 | 511.96 | ON TRACK |
Baz | 12347 | 6 | 7 | 6 | 7 | 6.50 | 13149.55 | 802.55 | AVG |
Tamsan | 15678 | 6 | 7 | 8 | 8 | 7.25 | 16814.65 | 1136.66 | BEST |
bazza@amiga-MacBookPro:~/Desktop/Code/Shell$ 
bazza@amiga-MacBookPro:~/Desktop/Code/Shell$ # Now check with python...
bazza@amiga-MacBookPro:~/Desktop/Code/Shell$ 
bazza@amiga-MacBookPro:~/Desktop/Code/Shell$ python
Python 2.7.15+ (default, Nov 27 2018, 23:36:35) 
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> ((11377*4.5)/100)+11377
11888.965
>>> ((12347*6.5)/100)+12347
13149.555
>>> ((15678*7.25)/100)+15678
16814.655
>>> _


Last edited by wisecracker; 08-12-2019 at 04:30 AM.. Reason: The EXIT command had a bug...
# 12  
Old 08-11-2019
Thanks a lot for your inputs, I would like to sort into descending order based one Avg Q while displaying the table
Code:
cat /tmp/salary.txt| sort -k 7

While using above code i am not able to sort based on Avg Q. Instead the header is also getting sorted
# 13  
Old 08-11-2019
You wanted the python code in bash so don't run before you can walk!
The code, (#11), CAN be improved, it also has no error detection nor reporting, it has no means of going over a persons wrongly inputted data and it WILL overwrite the file on every (re)run.
I left those those anomalies out for you to to learn by working them out.

And line 3 of your python code does NOT do what you expect: av1 = float(sum / 4)
As your example always shows integer values for q1 to q4 the let's see what happens...
Code:
bazza@amiga-MacBookPro:~$ python
Python 2.7.15+ (default, Nov 27 2018, 23:36:35) 
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> av1 = 5+6+7+7
>>> float(av1/4)
6.0
>>> exit()
 bazza@amiga-MacBookPro:~$ _

As you can see, the float is a conversion of integer division.
Either that is a bug or q1 to q4 MUST be, for example, sum = 5.0+6.0+7.0+7.0 to arrive at 6.25...
This User Gave Thanks to wisecracker For This Post:
# 14  
Old 08-11-2019
Quote:
Originally Posted by rohit_shinez
... i am not able to sort based on Avg Q.
You need to tell sort the correct field delimiter. Try
Code:
sort -t"|" -k7g /tmp/salary.txt

(you see - no useless catneeded)


Quote:
Instead the header is also getting sorted
Unfortunately, sort doesn't offer special header treatment. You'll need to take it out of the sort process; like
Code:
{ read; echo $REPLY; sort -t"|" -k7bg; } </tmp/salary.txt

Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Employee records

If there are 2 records for an Employee, How can I choose the one with eff_status = ‘Active' and ignore the eff_status ='Terminated'. if there is only one record, then just write that record regardless of the eff_status. Please assist. (1 Reply)
Discussion started by: Harimalyala
1 Replies

2. UNIX for Dummies Questions & Answers

Calculate

i have file input abcedef|wert|13|03|10|04|23|A1|13|05|01|09|31 fsdasdf|ferg|12|04|25|21|21|A1|13|02|26|20|31 dfsfsad|gerg|12|04|25|21|21|A1|13|02|25|25|31 i expect the output abcedef|wert|13|03|10|04|23|A1|13|05|01|09|31|9.516666667... (5 Replies)
Discussion started by: radius
5 Replies

3. Shell Programming and Scripting

Calculate age of a file | calculate time difference

Hello, I'm trying to create a shell script (#!/bin/sh) which should tell me the age of a file in minutes... I have a process, which delivers me all 15 minutes a new file and I want to have a monitoring script, which sends me an email, if the present file is older than 20 minutes. To do... (10 Replies)
Discussion started by: worm
10 Replies

4. Shell Programming and Scripting

How To Calculate

I have 2 variables in my shell scripts in which i am using awk and calculating 2 files and getting 2 different variable called in_total and out_total. I want to subtract one variable from another so plz tell me how i can do that. Example is: cat in_file | awk -F: '{ in_total += $1 * 86400... (3 Replies)
Discussion started by: krishna_sicsr
3 Replies

5. Shell Programming and Scripting

How can i calculate percentage ??

i have 3 files like total.dat=18 equal.dat=14 notequal.dat=16 i need find the equal percentange means: equalpercentage = ($equal.dat / $total.dat * 100) How i can do this ? I tried some of the answers to calculate the percentage in this forums.but it couldn't worked.Some one please... (6 Replies)
Discussion started by: bobprabhu
6 Replies

6. Shell Programming and Scripting

calculate the space

Hi everyone, I need to write a script to calculate the space for sub-folders under /home: Here is the scanrio: cd /home drwxr-xr-x 57 root root 8192 Jan 22 16:13 home_1 drwxrwxrwx 69 root root 8192 Jan 29 10:36 home_2 drwxr-xr-x 97 root root 8192 Nov... (8 Replies)
Discussion started by: za_7565
8 Replies

7. News, Links, Events and Announcements

Announcing collectl - new performance linux performance monitor

About 4 years ago I wrote this tool inspired by Rob Urban's collect tool for DEC's Tru64 Unix. What makes this tool as different as collect was in its day is its ability to run at a low overhead and collect tons of stuff. I've expanded the general concept and even include data not available in... (0 Replies)
Discussion started by: MarkSeger
0 Replies

8. Shell Programming and Scripting

calculate output

I was wondering can anyone give me a clue how to start script which would do the following: I have 2 numbers as input for example: 100 and 1000 and I need to create file and in that file should be written 100 - 199 200 - 299 300 - 399 400 - 499 500 - 599 600 - 699 700 - 799... (3 Replies)
Discussion started by: amon
3 Replies

9. UNIX for Dummies Questions & Answers

bc calculate problem

Hi , this is the first time i use bc to calculate and i would have decimal result , i use the following : toto=400;scale=1 echo $toto / 1000|bc scale to adjust the numbers after the command would have in this case 0.4 as result and i wonder why i have always 0 as result. Somebody can... (2 Replies)
Discussion started by: Nicol
2 Replies
Login or Register to Ask a Question