Removing trailing zeroes | Unix Linux Forums | Shell Programming and Scripting

  Go Back    


Shell Programming and Scripting Post questions about KSH, CSH, SH, BASH, PERL, PHP, SED, AWK and OTHER shell scripts and shell scripting languages here.

Removing trailing zeroes

Shell Programming and Scripting


Closed Thread    
 
Thread Tools Search this Thread Display Modes
    #1  
Old 02-25-2010
treesloth treesloth is offline
Registered User
 
Join Date: Oct 2008
Last Activity: 21 August 2014, 4:39 PM EDT
Location: Orem, Utah
Posts: 165
Thanks: 15
Thanked 4 Times in 4 Posts
Removing trailing zeroes

So, I can't figure out how to do a previous question with printf, so I'm taking a different approach. Suppose I have a set of numbers:


Code:
1200,135.000000,12.30100,3212.3200,1.759403,,1230,101.101010,100.000000

I want to remove all trailing zeroes after the decimal, and, if it ends up orphaned, the decimal itself. That last bit's not so important; if just the trailing zeroes can be removed, I'm certain I can kill off orphaned decimals. My various attempts are, at best, weak partial solutions. I can remove trailing zeroes and a few other tricks, but all fall short. The only guarantees about the incoming data are 1) the first field will always be a positive integer and no field will have more than 6 digits after the decimal.

So, how in the world can I remove from each field (except the first, to which this need not apply) any trailing zeroes after the decimal? For what it's worth, after digging through the forum, I've found no working solutions. A method (gsub? looping gsub? idunno...) that works would give as output for the above line:


Code:
1200,135,12.301,3212.32,1.759403,,1230,101.101010,100

Sponsored Links
    #2  
Old 02-25-2010
anbu23's Avatar
anbu23 anbu23 is offline Forum Advisor  
Advisor
 
Join Date: Mar 2006
Last Activity: 31 July 2014, 8:46 AM EDT
Location: Bangalore,India
Posts: 2,089
Thanks: 12
Thanked 131 Times in 126 Posts

Code:
$ echo 1200,135.000000,12.30100,3212.3200,1.759403,,1230,101.101010,100.000000 | sed "s/\.0\{1,\}//g"
1200,135,12.30100,3212.3200,1.759403,,1230,101.101010,100

Sponsored Links
    #3  
Old 02-25-2010
treesloth treesloth is offline
Registered User
 
Join Date: Oct 2008
Last Activity: 21 August 2014, 4:39 PM EDT
Location: Orem, Utah
Posts: 165
Thanks: 15
Thanked 4 Times in 4 Posts
Quote:
Originally Posted by anbu23 View Post
Code:
$ echo 1200,135.000000,12.30100,3212.3200,1.759403,,1230,101.101010,100.000000 | sed "s/\.0\{1,\}//g"
1200,135,12.30100,3212.3200,1.759403,,1230,101.101010,100

If at all possible, I'd like to do this within an awk script, although I don't object to a system call in a pinch. Also, when I run your solution, I get:


Code:
# echo 1200,135.000000,12.30100,3212.3200,1.759403,1230,101.101010,100.000000 | sed "s/\.0\{1,\}//g"
1200,135,12.30100,3212.3200,1.759403,1230,101.101010,100

instead of:


Code:
1200,135,12.301,3212.32,1.759403,1230,101.101010,100

Do you get the same on your system, or does it work there?

FWIW, the most promising (but still failed...) solution I can think of is to put a trailing comma on $0, and then apply up to 5 times something like:

gsub("0,",",",$0)

Unfortunately, that only works if there's a way to apply it only to those fields which contain a decimal point. The fact that this is a gsub applying to $0 makes that difficult, and the solution as written would turn, for example, 1200 into 120, then into 12 on a second application.
    #4  
Old 02-25-2010
daptal daptal is offline
Registered User
 
Join Date: Mar 2009
Last Activity: 18 July 2012, 9:53 PM EDT
Posts: 175
Thanks: 0
Thanked 2 Times in 2 Posts

Code:
 cat abc.txt
1200
135.000000
12.30100
3212.3200
1.759403
1230
101.101010
100.000000

awk '{ if ($0 ~ /\./){ sub("0*$","",$0); sub ("\.$","",$0);} print}' abc.txt

1200
135
12.301
3212.32
1.759403
1230
101.10101
100

HTH,
PL
Sponsored Links
    #5  
Old 02-25-2010
anbu23's Avatar
anbu23 anbu23 is offline Forum Advisor  
Advisor
 
Join Date: Mar 2006
Last Activity: 31 July 2014, 8:46 AM EDT
Location: Bangalore,India
Posts: 2,089
Thanks: 12
Thanked 131 Times in 126 Posts

Code:
$ echo 1200,135.000000,12.30100,3212.3200,1.759403,1230,101.101010,100.000000 | awk -F"," -v OFS="," ' { for(i=0;NF-i++;){sub("[.]*0+ *$","",$i)};$1=$1 }1 '
12,135,12.301,3212.32,1.759403,123,101.10101,100



---------- Post updated at 10:51 PM ---------- Previous update was at 10:45 PM ----------

My sed and datpal's awk solution fail in this case


Code:
$ echo 1200.00200300 | sed "s/\.0\{1,\}//g"
1200200300
$ echo 1200.00200300 | awk '{ if ($0 ~ /\./){ sub("0*$","",$0); sub ("\.$","",$0);} print}'
1200.00200


Code:
$ echo 1200.00200300 | awk -F"," -v OFS="," ' { for(i=0;NF- i++;){sub("[.]*0+ *$","",$i)};$1=$1 }1 '
1200.002003

Sponsored Links
    #6  
Old 02-25-2010
daptal daptal is offline
Registered User
 
Join Date: Mar 2009
Last Activity: 18 July 2012, 9:53 PM EDT
Posts: 175
Thanks: 0
Thanked 2 Times in 2 Posts
Quote:
Originally Posted by anbu23 View Post
[CODE]$
---------- Post updated at 10:51 PM ---------- Previous update was at 10:45 PM ----------

[/COLOR]My sed and datpal's awk solution fail in this case


Code:
$ echo 1200.00200300 | sed "s/\.0\{1,\}//g"
1200200300
$ echo 1200.00200300 | awk '{ if ($0 ~ /\./){ sub("0*$","",$0); sub ("\.$","",$0);} print}'
1200.00200


Code:
$ echo 1200.00200300 | awk -F"," -v OFS="," ' { for(i=0;NF- i++;){sub("[.]*0+ *$","",$i)};$1=$1 }1 '
1200.002003


It works fine for me anbu23

Code:
 echo 1200.00200300 | awk '{ if ($0 ~ /\./){ sub("0*$","",$0); sub ("\.$","",$0);} print}'
1200.002003

In fact what u gave will break for whole numbers

Code:
 echo 100 | awk -F"," -v OFS="," ' { for(i=0;NF- i++;){sub("[.]*0+ *$","",$i)};$1=$1 }1 '
1

Sponsored Links
    #7  
Old 02-26-2010
anbu23's Avatar
anbu23 anbu23 is offline Forum Advisor  
Advisor
 
Join Date: Mar 2006
Last Activity: 31 July 2014, 8:46 AM EDT
Location: Bangalore,India
Posts: 2,089
Thanks: 12
Thanked 131 Times in 126 Posts
Quote:
Originally Posted by daptal View Post
It works fine for me anbu23

Code:
 echo 1200.00200300 | awk '{ if ($0 ~ /\./){ sub("0*$","",$0); sub ("\.$","",$0);} print}'
1200.002003

In fact what u gave will break for whole numbers

Code:
 echo 100 | awk -F"," -v OFS="," ' { for(i=0;NF- i++;){sub("[.]*0+ *$","",$i)};$1=$1 }1 '
1

I added a slash and it worked for me

Code:
$ echo 1200.00200300 | awk '{ if ($0 ~ /\./){ sub("0*$","",$0); sub ("\\.$","",$0);} print}'
1200.002003

You are right. My code will break for whole numbers. Here is the fixed code


Code:
echo 1200,135.000000,12.30100,3212.3200,1.759403,1230,101.101010,100.000000 | awk -F"," -v OFS="," ' { for(i=0;NF-i++;){ if($i ~ /[.]/){ sub("[.]*0+ *$","",$i) }}$1=$1}1'
1200,135,12.301,3212.32,1.759403,1230,101.10101,100

Sponsored Links
Closed Thread

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
Removing leading and trailing spaces only in PERL kumar04 Shell Programming and Scripting 2 04-04-2009 03:17 PM
sed: removing any and all trailing digits? Squeakygoose Shell Programming and Scripting 5 03-09-2009 07:43 AM
Removing trailing spaces from delimited files djkane Shell Programming and Scripting 6 03-29-2006 05:11 AM
re: removing trailing space from lines oombera Shell Programming and Scripting 1 06-19-2003 10:12 AM
removing trailing spaces of a particular column in a file rooh UNIX for Dummies Questions & Answers 2 01-12-2002 10:34 AM



All times are GMT -4. The time now is 02:05 PM.