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

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

Who is Participating?
tel2Connect With a Mentor Commented:
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
libertyforall2Author Commented:
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.
Never miss a deadline with

The revolutionary project management tool is here!   Plan visually with a single glance and make sure your projects get done.

ozoConnect With a Mentor Commented:
perl -alne 'BEGIN{$i=pop}if($F[3]){$F[3]+=3.2}else{$F[3]/=$i}; print "@F"' file1.txt .8 > file1b.txt
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.
to my last 2 solutions, pls lfa2.
libertyforall2Author Commented:
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.