Visit Our UNIX and Linux User Community


Bash script to print the smallest floating point number in a row that is not 0


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Bash script to print the smallest floating point number in a row that is not 0
# 1  
Old 10-31-2018
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.

Thanks for any suggestions,

LMHmedchem
# 2  
Old 10-31-2018
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?
# 3  
Old 10-31-2018
Sorry, I am a bit tired myself.

This is a some input. There could be up to 100 cols or so in theory.
Code:
1   1.83958   0.0       0.0   0.0  -0.330313
2   0.450996  0.112848  0.0   0.0   0.136161
3  22.8728    0.0       0.0   0.0   0.0

The output would be,
Code:
1  -0.330313
2   0.112848
3  22.8728

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,
Code:
GNU bash, version 4.1.10(4)-release (i686-pc-cygwin)

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.

LMHmedchem
# 4  
Old 11-01-2018
What output do you want if all fields are zero?

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:
# 5  
Old 11-01-2018
Quote:
Originally Posted by Don Cragun
What output do you want if all fields are zero?

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:
# 6  
Old 11-01-2018
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.
These 3 Users Gave Thanks to Don Cragun For This Post:
# 7  
Old 11-02-2018
Quote:
Originally Posted by Don Cragun
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,
Code:
index	name	col_1	col_2	col_3	col_4	col_5
1	name_1	6.55903	0	0	0	3.44097
2	name_2	6.73342	0	4.45826	0	5.80832
3	name_3	6.7876	0	9.04868	0	8.16372
4	name_4	7.07704	0	2.06362	-0.6363	0.6673
5	name_5	0	13.15	0	10.4517	3.39833

This version seems to work,
Code:
#! /bin/sh

# assumes that the input file has a header row
# assumes that the first column is the index and the second column is a name
# assumes that all columns after the first two contain data

# input file name
input_file=$1
# output file name
output_file=$2

awk ' NR>1 { split($0, line_array, "\t");
             id=line_array[1];
             name=line_array[2];
             delete line_array[1];
             delete line_array[2];
             asort(line_array);
             for(x in line_array) {
                if(line_array[x] != 0) { print id "\t" name "\t" line_array[x];  break; }
             }
             delete line_array;
           }' $input_file > $output_file

giving the output,
Code:
1	name_1	3.44097
2	name_2	4.45826
3	name_3	6.7876
4	name_4	-0.6363
5	name_5	3.39833

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..

Previous Thread | Next Thread
Test Your Knowledge in Computers #814
Difficulty: Easy
Cascading Style Sheets (CSS) is a style sheet language used for describing the presentation of a document written in a markup language like HTML.
True or False?

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Comparison of floating point numbers in bash

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)
Discussion started by: ngabrani
12 Replies

2. Shell Programming and Scripting

Convert floating point to a number

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)
Discussion started by: skatpally
9 Replies

3. Shell Programming and Scripting

[BASH] Floating point exception

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)
Discussion started by: sea
9 Replies

4. Shell Programming and Scripting

Bash Floating point math with bc

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)
Discussion started by: bmfmancini
3 Replies

5. Shell Programming and Scripting

[BASH] Regex for floating point number

Hey again, I have a basic regex that tests if a number is a float. Thank you. (5 Replies)
Discussion started by: whyte_rhyno
5 Replies

6. Shell Programming and Scripting

problem with floating point number loops

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)
Discussion started by: ergy1983
10 Replies

7. Shell Programming and Scripting

floating point number problem

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)
Discussion started by: learnbash
5 Replies

8. Shell Programming and Scripting

floating point not recognized by printf in bash

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)
Discussion started by: josegr
2 Replies

9. Shell Programming and Scripting

using bc with floating point number in files

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)
Discussion started by: f_o_555
14 Replies

10. Shell Programming and Scripting

BASH: floating point exception

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)
Discussion started by: mapleleaves
5 Replies

Featured Tech Videos