Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
?
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
Medium Priority
?
336 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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 1000 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
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
LVL 84

Assisted Solution

by:ozo
ozo earned 1000 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: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering 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

Today, the web development industry is booming, and many people consider it to be their vocation. The question you may be asking yourself is – how do I become a web developer?
What do responsible coders do? They don't take detrimental shortcuts. They do take reasonable security precautions, create important automation, implement sufficient logging, fix things they break, and care about users.
Progress
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…

618 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