Using IF statements with maths where the input is not an integer


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Using IF statements with maths where the input is not an integer
# 1  
Old 08-12-2011
Using IF statements with maths where the input is not an integer

Hi All

I've made a few scripts which using GDAL extract the value of a pixel within a given raster. The purpose is to work out the combine value of every pixel. I thought there may have been an easier way to do this but alas!

The code below extracts the pixel value at position X Y. The value is a floating point rather than an integer and thats where my problem lies. The if statement simply exports the value to a txt file. Other scripts take care of the rest ie change values of X Y and summing the resultant txt files.
Code:
#!/bin/sh
input=`gdallocationinfo -valonly 210_1515_volume.env X Y`  # The value of the pixel at coordinate X Y
if [ $input -gt 0 ] ;then
	echo $input > colrow.txt
fi

However, I get the following message back when ever my statement is true because my value isn't an integer;

extract2.sh: line 4: [: 2.15787172317505: integer expression expected

Please note the raster file mostly contains zero values, and its only the values greater than zero I'm interested in, which is why I added the expression.

Any ideas how I can alter this code so the IF statement excepts integers? Alternatively if anyone knows of a faster method of quickly summing the values of a raster file, that would be equally useful.

Many thanks in advance for any assistance you can offer.

Andy

Last edited by vbe; 08-12-2011 at 10:50 AM.. Reason: please use code tags!
# 2  
Old 08-12-2011
Try string comparison:
Code:
if [ "$input" != "0" ]; then
...


Last edited by yazu; 08-12-2011 at 11:18 AM.. Reason: double posting
This User Gave Thanks to yazu For This Post:
# 3  
Old 08-12-2011
Yes this works, Thank you Yazu!

Whilst re-examining what I'm trying to do I've realised that I may be over complicating things, I can turn my original raster file into a ascii txt file with one command. So now all I need to do is work out how to sum all the values within a txt file.... I am sure there must be a post on that around here somewhere!

More practice at shell scripting anyway!

---------- Post updated at 02:39 PM ---------- Previous update was at 01:50 PM ----------

Ok maybe this is harder than I thought it might be. It seems its not easy to sum up floating point values in a txt file as many programs are designed for use with integers.

A sample of my txt file;
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2.7223560810089111328 2.4221210479736328125 0 0 2.0098361968994140625 2.9117717742919921875 2.4130835533142089844 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

So I'm trying to find the total of all these values. Ive tried a few things picked up from other forum posts;

Code:
Code:
awk '{s+=$1} END {print s}' 210.txt

This produces a value of zero, so I'm guessing its not recognising floating point values.

Code:
Code:
i=0
for n in `cat 210.txt`
do
    i=`expr $i + $n`
done
echo $i

But I get a syntax error.

Still searching for other solutions... any help would be appreciated!

---------- Post updated at 04:22 PM ---------- Previous update was at 02:39 PM ----------

Ok I think I've found a solution, in case anyone else has a similar problem in the future.

Create the following script 'sumall.awk'.
Code:
#sumall.awk
{   for (i=1; i<=NF; i++) { sum[i]+= $i }   }

END { for (i=1; i<=NF; i++ ) 
	{ print sum[i] } 
          }

then 

awk -f sumall.awk < 210.txt > output.txt

to output the sum of each col into an output.txt file.

then
Code:
awk '{ print "a = a + " $1 "; a" }' output.txt | bc -l | tail -1 > 210_final.txt

to print the sum of output.txt into a new file '210_final.txt'

This method is much much faster than my original plan. AWK ftw!

Andy

Last edited by vbe; 08-12-2011 at 02:09 PM.. Reason: code tags!!!!
# 4  
Old 08-12-2011
You really over complicated things. Smilie Awk can work with floating numbers (even "old" awk, afaik).

You just need this:
Code:
awk  '{ for (i=1; i<=NF; i++)  s+= $i  } END { print s }'

In your first attempt you just add zero with the first field and this field was zero.
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 constant e to 14+ decimal places using integer maths.

Hi guys... I am loving this integer maths thing. 64 bit systems are certainly easier than 32 bit, but hey, I don't intend to leave out my fav' platform. Using one of the 'Brothers' methods, URL inside the code. #!/bin/sh # # #!/usr/local/bin/dash # e_constant.sh # Brother's formula . #... (2 Replies)
Discussion started by: wisecracker
2 Replies

2. Shell Programming and Scripting

Maths in shell scripts

Hi, Need help on this. I need to increment a variable by 1 but retain as 2 characters. I am using expr to do additions: NEWSERIAL=`expr $SERIAL + 1` $SERIAL can range from 01-99. After adding "1", I need the result to be 2 characters, eg: 02+1 = 03. By default expr will truncate the... (4 Replies)
Discussion started by: vchee
4 Replies

3. Shell Programming and Scripting

Simple maths calculator loop.

Hi, I am trying to make a maths calculator that: 1. Prompts the user for a number. 2. Prompts the user for an operation (add, subtract, divide or multiply) 3. Prompts the user for a number. 4. Prompts the user for another operation (same as above) OR the option to get the result for the... (4 Replies)
Discussion started by: johnthebaptist
4 Replies

4. Programming

I don't know how to replace input char with appropriate integer

Hi guys, I asked for help on programming forums and no one didn't helped me so I ask for help here. I am playing with some tasks from my book and I can't figure where did I get wrong. From the first program I get a blank screen, program won't generate 10*10 matrix. And second problem is I... (6 Replies)
Discussion started by: solaris_user
6 Replies

5. UNIX for Dummies Questions & Answers

Check if input is an integer or a floating point?

Hiii I actually intent to check the integer or floating point number input by user i.e. 23, 100, 55.25, 12.50 ..etc. However, when someone input strings or alpha character, my program has to show invalid input.!! Is there any Unix shell script syntax can help me to check ? Thanking you (2 Replies)
Discussion started by: krishnampkkm
2 Replies

6. Shell Programming and Scripting

Maths with variables

Hello, I'm trying to write a while loop for a decimal value in tcsh which I know can't be done. Instead I want my increments to be one order of magnitude too large and then divide it by 10 when I use the variable. However, I don't know how to divide my variable and set it as another. set... (1 Reply)
Discussion started by: DFr0st
1 Replies

7. Programming

How i can read a long integer from standar input and a string with as many characters as specified..

how i can read a long integer from standar input and a string with as many characters as specified in the number? i thing that i must use the read command ofcourse.... (6 Replies)
Discussion started by: aintour
6 Replies

8. Shell Programming and Scripting

Perl - maths equation - need help

if input to the perl program is ' ( p * ((a+b) * (c+d))) + q ' it shuld give the output as ' pac + pad + pbc + pbd + q ' .can anyone suggest a way to do this ? (7 Replies)
Discussion started by: Anuj8584
7 Replies

9. Shell Programming and Scripting

isql input file with multiple sql statements

I've got: isql -U $USERID -S $SERVER -D $DATABASE -i inputfile.sql -o outputfile.txt in inputfile I have: go sql#1 go sql#2 go sql#3 go I also tried without "go" and with";" instead which did not work SQL statements will work if I paste them directly into the script and use EOF ... (0 Replies)
Discussion started by: Cailet
0 Replies

10. Shell Programming and Scripting

Problem with Maths

Heres a script i wrote as a bit of practise. What it does is insert a line in the middle of a file. The line being $1 and the file being $2 #!/bin/bash rm tempfile touch tempfile count=1 linenum= `wc -l < $2` if then echo $1 >> $2 else even=`expr "$linenum" % 2` if then... (3 Replies)
Discussion started by: Quesa
3 Replies
Login or Register to Ask a Question