Solved

multiplying or dividing all values in the last column of a file using one liner perl script in linux

Posted on 2011-09-20
7
331 Views
Last Modified: 2012-05-12
I'm using the code below to add or subtract values from each value in the last column of data in a 4 column file (see attached). Instead of adding/subtracting how would I divide or multiply? Would be as simply as replacing the the minus with a * or / next to the number I wanted the value mutliplied or divided by?

[user@server ~]$ perl -alne 'BEGIN{$i=pop}($F[3]+=$i)>0 or $F[3]=0; print "@F"' file1.txt -0.468 > file1b.txt

Open in new window

0
Comment
Question by:libertyforall2
  • 3
  • 2
  • 2
7 Comments
 
LVL 84

Expert Comment

by:ozo
ID: 36571052
yes
0
 

Author Comment

by:libertyforall2
ID: 36571090
Ok. One more quick question. I just realized I will need to add/subtract a value if the data point is zero else multiply/divide by a different value. Lets say add 3.2 if zero else divide by .8 for all values in the final column.
0
 
LVL 12

Accepted Solution

by:
tel2 earned 250 total points
ID: 36572869
Hi lfa2,

Regarding your first question, if you're asking if you could do this:
    perl -alne 'BEGIN{$i=pop}($F[3]+=$i)>0 or $F[3]=0; print "@F"' file1.txt *0.468 > file1b.txt
and this:
    perl -alne 'BEGIN{$i=pop}($F[3]+=$i)>0 or $F[3]=0; print "@F"' file1.txt /0.468 > file1b.txt
then my answer would be: No.  I think that argument after the input file (e.g. -0.468) must be just a number (which can be +ve or -ve), otherwise I think you'd be doing maths like:
  $F[3]+=/.8    (ie: $F[3] = $F[3] + /.8)
which doesn't make sense to me.

For your second question, does this work for you?:
    perl -alne 'BEGIN{$mult=pop;$add=pop};$F[3] = ($F[3]==0 ? eval("$F[3]$add") : eval("$F[3]$mult")); print "@F"' file1.txt +3.2 /.8 >file1b.txt
0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 84

Assisted Solution

by:ozo
ozo earned 250 total points
ID: 36573004
perl -alne 'BEGIN{$i=pop}if($F[3]){$F[3]+=3.2}else{$F[3]/=$i}; print "@F"' file1.txt .8 > file1b.txt
0
 
LVL 12

Expert Comment

by:tel2
ID: 36576909
As you may have noticed lfa2, my solutions assume you want to supply the +3.2 and /.8 as arguments (i.e. after the code):

Here's a slightly more efficient one (the 1st "eval" was not needed):
    perl -alne 'BEGIN{$mult=pop;$add=pop};$F[3] = $F[3]==0 ? $F[3]+=$add : eval "$F[3]$mult"; print "@F"' file1.txt -3.2 /.8 >file1b.txt

And if you are always going to be dividing (never multiplying), it could be further simplified to:
    perl -alne 'BEGIN{$div=pop;$add=pop}$F[3] = $F[3]==0 ? $F[3]+$add : $F[3]/$div; print "@F"' file1.txt +3.2 .8 >file1b.txt

Which can be compressed to:
    perl -alne 'BEGIN{$d=pop;$a=pop}$F[3]=$F[3]==0?$F[3]+$a:$F[3]/$d;print"@F"' file1.txt +3.2 .8

Or if you're always going to be multiplying:
    perl -alne 'BEGIN{$m=pop;$a=pop}$F[3]=$F[3]==0?$F[3]+$a:$F[3]*$m;print"@F"' file1.txt +3.2 1.25
As you can see, I'm multiplying by 1.25, which is the same as dividing by .8.
0
 
LVL 12

Expert Comment

by:tel2
ID: 36576924
Append:
  >file1b.txt
to my last 2 solutions, pls lfa2.
0
 

Author Closing Comment

by:libertyforall2
ID: 36584610
Works
0

Featured Post

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Active Directory replication delay is the cause to many problems.  Here is a super easy script to force Active Directory replication to all sites with by using an elevated PowerShell command prompt, and a tool to verify your changes.
In this post we will learn how to make Android Gesture Tutorial and give different functionality whenever a user Touch or Scroll android screen.
Learn several ways to interact with files and get file information from the bash shell. ls lists the contents of a directory: Using the -a flag displays hidden files: Using the -l flag formats the output in a long list: The file command gives us mor…
In a recent question (https://www.experts-exchange.com/questions/29004105/Run-AutoHotkey-script-directly-from-Notepad.html) here at Experts Exchange, a member asked how to run an AutoHotkey script (.AHK) directly from Notepad++ (aka NPP). This video…

749 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question