Bash script to print the smallest floating point number in a row that is not 0
Hello,
I have often found bash to be difficult when it comes to floating point numbers. I have data with rows of tab delimited floating point numbers. I need to find the smallest number in each row that is not 0.0. Numbers can be negative and they do not come in any particular order for a given row.
I guess I would do something like read each row into an array and then sort it but I am not quite sure if that would work with floating point numbers.
With more than 300 posts you should know that posting your OS, shell, and tools' versions plus some representative input usually helps. I'm too tired to build an input sample myself...
Does it have to be bash, or are text tools like awk welcome as well?
This is a some input. There could be up to 100 cols or so in theory.
The output would be,
I added a row index for clarity.
At the moment I am running this under cygwin but will probably run under opensuse as well. This is my bash version,
This could be with any tool I have under cygwin. I use sed and awk most frequently but I also have perl, ruby, python, etc.
I assume that you know that sed is not a common tool for this project, and, as you said, bash isn't well known for handling floating point values. If you want to process your file entirely in shell code, ksh would be a good choice. Otherwise, as you well know, awk is perfectly suited to problems like this.
What have you tried to solve this on your own? Where are you stuck?
This User Gave Thanks to Don Cragun For This Post:
I assume that you know that sed is not a common tool for this project, and, as you said, bash isn't well known for handling floating point values. If you want to process your file entirely in shell code, ksh would be a good choice. Otherwise, as you well know, awk is perfectly suited to problems like this.
What have you tried to solve this on your own? Where are you stuck?
Sorry, I was in a pretty bad accident last night and I just got back from the Hospital. I probably won't be able to respond more completely until tomorrow. I will answer your questions in my next post.
Thanks,
LMHmedchem
This User Gave Thanks to LMHmedchem For This Post:
I'm sorry to hear about your accident. Take the time you need to recover; we'll be ready to help when you get back to us.
Thanks, this board is always a great help.
For data like,
This version seems to work,
giving the output,
In short, it parses each row into an array with split(), assigns the first two positions to the id and name variables, and then deletes the first two positions. The array is then sorted with asort(). Finally the array is checked and the first element that is not 0 is printed along with the name and index. I believe that this gives me the smallest non-zero number.
I don't know the type that is used for the array, so I don't know if the above will work if 0 in the input file is actually 0.0, or 0.0000, etc. It is not really possible for input rows to be all 0, but I guess that should be trapped. I didn't think that awk had asort(). I think the cygwin actually calls gawk for awk commands but I'm not sure.
Will this work as I have it now?
LMHmedchem
Last edited by LMHmedchem; 11-02-2018 at 10:29 PM..
I have the following code snippet in bash
if ]; then
minm=`echo "$diff" | bc`
fi
It works well for most of the cases. However lets say diff is -0.17 and minm is -0.0017. In such a case the comparison seems to fail. Is the correct way to compare a mixture of positive and... (12 Replies)
Hello Guys,
I have a floating point number 1.14475E+15 I want to convert this number in to full number (Integer or Big integer). I tried couple of functions it did not work. When I use INT=${FLOAT/.*} I am getting value as 1. I don't want a truncated value
#!/bin/bash
#... (9 Replies)
Heyas
I have a script (vhs - video handler script, using ffmpeg) to encode videos.
It also encodes a dvd, but until now just non-copy-protected ones, so i've tried to add/implement a vobcopy wrapper to be used by my script.
At first it looked quite fine, but when changing from the first VOB... (9 Replies)
Hello Everyone,
I am currently working on a script to calculate optimal tcp window size
the formula that I am following is
2 x (bandwith speed /8 * Round Trip Time ) = x
This is what I have so far
#!/bin/bash
echo "Enter connection speed" << Get the speed of the Connection from... (3 Replies)
Hey,
I guess I am just to stupid and am not seeing the "wood for the trees", but I am always getting strange errors.
I want to create a mesh with coordinates like:
x y z
3.1 3.0 0.75 0 0 1
3.1 2.9 0.75 0 0 1
3.1 2.8 0.75 0 0 1
3.1 2.7 0.75 0 0 1
3.0 ... (10 Replies)
Hello folks
I Hope everyone is fine. I am calculating number of bytes calculation from apache web log.
awk '{ sum += $10 } END { print sum }' /var/httpd/log/mydomain.log
7.45557e+09
it show above number, what should i do it sow number like 7455, i mean if after decimal point above 5 it... (5 Replies)
Dear all,
I have the following question. Let's say that I have the following script
#!/bin/bash
value=0.4987865
a=` printf "%6.2f" $value `
b=`echo $value + $value | bc -l`
echo $a
echo $b
exit
And the exit is:
0,00
.9975730
Thus, the problem is that the printf order does not... (2 Replies)
Hi,
I' using bash and I would like to use "bc" to compute the ratio of of two numbers and assign the ratio to a variable.
The numbers are in a file, e.g.
196.304492
615.348986
Any idea how to do it?
N.B. I cannot change the file to have 196.304492 / 615.348986 as the file is produced by... (14 Replies)
Hi, guys,
today, I have copied a simple script which runs correctly on a computer to another one. But, the latter informs me:
Floating point exception!
@ ./command_module a b c
where command_module is the module compiled by myself.
So, I have fixed it by following steps:
1.... (5 Replies)