IMHO I don't think you will be able to better Python for your use here, of which your version is 2.x.x.
It might be a better bet to translate to Python 3.x.x, (currently 3.7.x stable).
Apart from Awk, inline floating point arithmetic is not quickly and easily possible without external utilities, such as Python, Perl, bc, etc, using most UNIX shells.
And even the shells that have FP, (ksh and zsh for example), make for shell lock-in, so portability is not at all easy.
Having written that, so long as the utilities are available in all users cases then a POSIX version might be translatable from your code...
As the python code already exists, it'd be most efficient to just tweak it so the formatting is exactly what you want.
Aside: the av1 <= 7 will never be reached with av1 equals 7 as that is already taken one statement above. This comment may look like nit-picking, but in coding you should always know exactly what you are doing.
Hi rohit_shinez...
(Apologies for any typos.)
In bash? Hmm, awk - most probably as it has builtin scientific maths and floating point capability, but I am no expert.
Bash has ONLY integer maths and that is its limitation. As I quoted before if you have access to tools/utilities that can do floats, Python, Perl, bc, dc, or others then it is possible as is creating your own FIXED point maths calculator. (Note: 'maths' as I am UKan.)
A simple fully POSIX compliant example of making a floating point number divided by an integer like your case. All values are global here to make for an easy to understand to the problems involved if you don't have any decent tools to manipulate scientific and FP values.
Also POSIX does NOT allow x**y hence the multiplier function. Fortunately 'bash' CAN handle this in integer mode only but not shown:
Code:
#!/usr/local/bin/dash
NUMBER=0
M=0
N=0
MULTIPLIER=1
TIMES_TEN=10
POWER=1
NO_DECIMAL=1
remove_decimal_point()
{
NUMBER=$1
M=${NUMBER%.*}
N=${NUMBER#*.}
MULTIPLIER=${#N}
NO_DECIMAL=${M}${N}
}
multiplier()
{
TIMES_TEN=$1
POWER=1
while [ ${TIMES_TEN} -ge 1 ]
do
POWER=$(( POWER * 10 ))
TIMES_TEN=$(( TIMES_TEN - 1 ))
done
}
remove_decimal_point 321.12345678
multiplier ${MULTIPLIER}
echo "Variables as global for this demo..."
echo "${NUMBER}"
echo "${M}"
echo "${N}"
echo "${NO_DECIMAL}"
echo "${MULTIPLIER}"
echo "${TIMES_TEN}"
echo ""
echo "Two calculations..."
echo "Firstly: Convert back to original string..."
printf "%.8f\n" "$(( NO_DECIMAL ))e-${MULTIPLIER}"
echo "Secondly: Two integers being divided and converted to FLOAT string..."
printf "%.8f\n" "$(( NO_DECIMAL / 11 ))e-${MULTIPLIER}"
echo "Confirm using Python..."
python -c "print( 321.12345678 / 11 )"
Result for this maths dilemma: OSX 10.14.3, default bash terminal calling dash...
Code:
Last login: Thu Aug 8 16:51:21 on ttys000
AMIGA:amiga~> cd Desktop/Code/Shell
AMIGA:amiga~/Desktop/Code/Shell> ./Float_Test.sh
Variables as global for this demo...
321.12345678
321
12345678
32112345678
8
0
Two calculations...
Firstly: Convert back to original string...
321.12345678
Secondly: Two integers being divided and converted to FLOAT string...
29.19304152
Confirm using Python...
29.1930415255
AMIGA:amiga~/Desktop/Code/Shell> _
You now see your problem...
HOWEVER; as I also quoted 'ksh' supports floating point arithmetic, including, float**another_float , which I have used often...
Unless your system does NOT have Python support then the code you have already would probably be better suited translated to awk.
I will pass those thoughts on to our awk experts...
I hope this helps wrap things up...
Thanks for your inputs, I am mainly looking for the same program to work on unix bash script. Can you able to help how i can achieve it instead of python code
Location: Asia Pacific, Cyberspace, in the Dark Dystopia
Posts: 19,118
Thanks Given: 2,351
Thanked 3,359 Times in 1,878 Posts
Quote:
Originally Posted by rohit_shinez
Thanks for your inputs, I am mainly looking for the same program to work on unix bash script. Can you able to help how i can achieve it instead of python code
Quote:
Originally Posted by RudiC
As the python code already exists, it'd be most efficient to just tweak it so the formatting is exactly what you want.
This is the correct approach as RudiC has pointed out.
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)
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)
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)
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)
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)
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)
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)
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)
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)