Taking largest (negative) number from column of coordinates and adding positive form to every other


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Taking largest (negative) number from column of coordinates and adding positive form to every other
# 8  
Old 10-05-2011
Quote:
Originally Posted by crunchgargoyle
I apologise for the confusion: I treated the four rows independently.

What I want to do is take the largest negative numbers of columns 6-8, make them positive, and add that positive number to every single number in their respective columns.
Do you want to determine the largest negative among ALL the columns and add its absolute value to ALL the negative values for ALL the columns?
Or you want to determine the largest negative PER COLUMN and add its absolute value PER CORRESPONDING columns?

For the later, see my original post.
For the former, use this:
Code:
BEGIN{OFS="\t"; ARGV[ARGC++] = ARGV[1] }
function abs(i) {return (i<0)?-i:i}

FNR==NR{
  for(i=1;i<=NF;i++)
    if ($i<0)
      m=($i<m)?$i:m
  next
}
{
  for(i=1;i<=NF;i++)
    if ($i<0)
     $i+=abs(m)
  print
}

This User Gave Thanks to vgersh99 For This Post:
# 9  
Old 10-05-2011
Quote:
Originally Posted by crunchgargoyle
I apologise for the confusion: I treated the four rows independently.

What I want to do is take the largest negative numbers of columns 6-8, make them positive, and add that positive number to every single number in their respective columns.

---------- Post updated at 06:19 PM ---------- Previous update was at 06:13 PM ----------



Thank you very much vgersh99 - that's doing almost exactly what I want. The only tiny thing is that even when numbers are positive in the column, I need them to have the largest negative number added to them if a negative number exists in that column.

I must apologise for these repeated requests and for not explaining myself clearly in the first instance.
ok, try this:
Code:
BEGIN{OFS="\t"; ARGV[ARGC++] = ARGV[1] }
function abs(i) {return (i<0)?-i:i}

FNR==NR{
  for(i=1;i<=NF;i++)
    if ($i<0)
      m[i]=($i<m[i])?$i:m[i]
  next
}
{
  for(i=1;i<=NF;i++)
    if (i in m)
     $i+=abs(m[i])
  print
}

This User Gave Thanks to vgersh99 For This Post:
# 10  
Old 10-05-2011
You're doing better than usual, it sometimes takes 4 pleas for a poster to show their data, let alone admit what they want Smilie

Working on it...

---------- Post updated at 11:29 AM ---------- Previous update was at 11:26 AM ----------

Code:
$ cat least.awk
BEGIN {
        OFS="\t"
        while(getline < FILE)
        for(N=6; N<=8; N++) if($N < MIN[N]) MIN[N]=$N
        close(FILE);

        while(getline < FILE)
        {
                for(N=6; N<=8; N++) $N -= MIN[N]
                print
        }
        exit
}
$ awk -f least.awk -v FILE="data2"
HETATM  1       C       UNK     0       0       7.865   8.47    0.00    0.00   C+0
HETATM  2       C       UNK     0       0.771   8.448   7.265   0.00    0.00   C+0
HETATM  3       C       UNK     0       2.307   8.257   7.385   0.00    0.00   C+0
HETATM  4       C       UNK     0       3.077   8.844   6.174   0.00    0.00   C+0
$

---------- Post updated at 11:30 AM ---------- Previous update was at 11:29 AM ----------

Quote:
Originally Posted by vgersh99
BEGIN{OFS="\t"; ARGV[ARGC++] = ARGV[1] }
You can modify argv? That's a clever way of getting the same file twice! Smilie
This User Gave Thanks to Corona688 For This Post:
# 11  
Old 10-05-2011
Both of the methods you guys have suggested work perfectly and I'm really thankful to you both.

But er ... I've realised that what I actually need is to determine the largest negative among ALL the columns and add its absolute value to ALL the positive AND negative values for ALL the columns

THAT is definitely what I need. I'm very sorry: is there a simple modification to one of the methods to be able to do this? I don't have any real experience with awk.

Immense thanks for any further help.
# 12  
Old 10-05-2011
ALL the columns? Even the ones that say HETATM, C, and UNK?

You'd better just tell us which columns.

Or better yet: An example of your input and output data!!

---------- Post updated at 04:30 PM ---------- Previous update was at 04:24 PM ----------

If I've guessed the correct "all":

Code:
$ cat least.awk
BEGIN { OFS="\t"
        while(getline < FILE)
        for(N=6; N<=10; N++) if($N < MIN) MIN=$N
        close(FILE);

        while(getline < FILE)
        {
                for(N=6; N<=10; N++) $N -= MIN;
                print
        }
        exit
}

$ awk -v FILE=data2 -f least.awk
HETATM  1       C       UNK     0       0       33.504  34.109  25.639  25.639 C+0
HETATM  2       C       UNK     0       0.771   34.087  32.904  25.639  25.639 C+0
HETATM  3       C       UNK     0       2.307   33.896  33.024  25.639  25.639 C+0
HETATM  4       C       UNK     0       3.077   34.483  31.813  25.639  25.639 C+0
$

This User Gave Thanks to Corona688 For This Post:
# 13  
Old 10-05-2011
Yes you guessed correctly - I feel like I've learnt a lot about how to explain specific problems specifically through all these mistakes! Smilie

Thanks so much guys - you've really helped out a PhD student in need Smilie
# 14  
Old 10-05-2011
Quote:
Originally Posted by crunchgargoyle
Both of the methods you guys have suggested work perfectly and I'm really thankful to you both.

But er ... I've realised that what I actually need is to determine the largest negative among ALL the columns and add its absolute value to ALL the positive AND negative values for ALL the columns

THAT is definitely what I need. I'm very sorry: is there a simple modification to one of the methods to be able to do this? I don't have any real experience with awk.

Immense thanks for any further help.
just for reference:
Code:
BEGIN{OFS="\t"; ARGV[ARGC++] = ARGV[1] }
function abs(i) {return (i<0)?-i:i}

FNR==NR{
  for(i=1;i<=NF;i++)
    if ($i<0) {
      m=($i<m)?$i:m
      nC[i]
  }
  next
}
{
  for(i=1;i<=NF;i++)
    if (i in nC)
     $i+=abs(m)
  print
}


Last edited by vgersh99; 10-05-2011 at 09:50 PM..
This User Gave Thanks to vgersh99 For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Splitting a file based on negative and positive numbers

I have a file that is pipe delimited and in Column F they have number values, both positive and negative. I need to take the one file I am starting with and split it into two separate files based on negative and positive numbers. What is the command to do so? And then I need to also transfer... (4 Replies)
Discussion started by: cckaiser15
4 Replies

2. UNIX for Beginners Questions & Answers

Converting negative number to positive in a file

Hi ALL, I am having semi column separated file as below. I am having negative values for the records starting with 11095. How can I convert that positive number I tried this below seems not working sed 's/ \(*\)$/ -\1/;t;s/\(.*\)-/\1/ myfile myfile... (6 Replies)
Discussion started by: arunkumar_mca
6 Replies

3. Shell Programming and Scripting

Print smallest negative number with corresponding index from a column

considering the following table: ID col1 col2 col3 col4 1 -16.06801249 13.49785832 -56.57087607 -27.00500526 2 -1.53315720 0.71731735 -42.03602078 -39.78554623 3 -1.53315190 0.71731587 -42.03601548 ... (3 Replies)
Discussion started by: Birda
3 Replies

4. Shell Programming and Scripting

Splitting a file based on positive and negative numbers

Dear All, I have to split a tab delimited file in two files based on the presence of a positive or negative in column number 9 , for example file: A 1 5 erg + 6766 0.9889 0.9817 9.01882 erg inside upstream B 1 8 erg2 + 6766 0.9889 0.9817 -9.22 erg2 inside... (3 Replies)
Discussion started by: paolo.kunder
3 Replies

5. Shell Programming and Scripting

addition of both positive and negative numbers

Let, I have three numbers +00123.25 -00256.54 +00489.23 I need to sum up all those three numbers, after storing them in three variables (say var1, var2, var3). I used both expr and BC, but they didn't work for me. But, I am not able to sum up them, as I don't have any idea how to... (13 Replies)
Discussion started by: mady135
13 Replies

6. Shell Programming and Scripting

Sorting positive and negative values

Hello, I have a list like this : 1 2 -4 0 -3 -7 5 6 etc. Is there a way to remove all the positive values and print only the negative values, without using grep, sed or awk? Thanks, Prasanna (4 Replies)
Discussion started by: prasanna1157
4 Replies

7. Shell Programming and Scripting

Finding the most positive and negative value and defining its position

Hi, I have a file that looks like this: Jake 2 3 4 6 4 3 -2 -1 Jerry 1 2 3 2 1 7 -6 -1 Timmy -1 -4 -5 -8 9 3 1 I want to find the most positive and negative value for each row and also define its position (based on column #) So the output would look... (7 Replies)
Discussion started by: gisele_l
7 Replies

8. Shell Programming and Scripting

Perl output with negative and positive numbers

Hello, For my weather station I have made a little perl script to put the data into cacti. The next problem I have. I can only get positive numbers or negative numbers. What do I do: Though a shell scrip I call the perl script. Shell script: #!/bin/sh cat data.txt | stats.pl Perl... (4 Replies)
Discussion started by: rbl-blacklight
4 Replies

9. Programming

Adding 2 difft int to form a number

got 1 problem.. can someone help me wit the logic? Money Money ::operator+(const Money &rhs)const { Money temp; temp.a = a+rhs.a; temp.b = b+rhs.b; return temp; }//end i got 2 number e.g 6.2 and 3.8 (1 Reply)
Discussion started by: xiaojesus
1 Replies

10. Shell Programming and Scripting

Help in adding positive & negative values in a column

Hi Gurus, In my file I have an amount field from position 74 to 87, which contains values starting with '+' as well as '-'. I want to add all positive values in a varible called "CREDIT" and all negative values in a variable "DEBIT". I know, we can use grep to identify values with positive and... (4 Replies)
Discussion started by: berlin_germany
4 Replies
Login or Register to Ask a Question