speed bump
speed bump

Reputation: 451

Multiplication of two variables containing tuples in BASH script

I have two variables containing tuples of same length generated from a PostgreSQL database and several successful follow on calculations, which I would like to multiply to generate a third variable containing the answer tuple. Each tuple contains 100 numeric records. Variable 1 is called rev_p_client_pa and variable 2 is called lawnp_p_client. I tried the following which gives me a third tuple but the answer rows are not calculated correctly:

rev_p_client_pa data is:

0.018183
0.0202814
0.013676
0.0134083
0.0108168
0.014197
0.0202814

lawn_p_client data is:

52.17
45
30.43
50
40
35
50

The command I used in the script:

awk -v var3="$rev_p_client_pa" 'BEGIN{print var3}' | awk -v var4="$lawnp_p_client" -F ',' '{print $(1)*var4}'

The command gives the following output:

0.948607
1.05808
0.713477
0.699511
0.564312
0.740657
1.05808

However when manually calculated in libreoffice calc i get:

0.94860711
0.912663
0.41616068
0.670415
0.432672
0.496895
1.01407

I used this awk structure to multiply a tuple variable with numeric value variable in a previous calculation and it calculated correctly. Does someone know how the correct awk statement should be written or maybe you have some other ideas that might be useful? Thanks for your help.

Upvotes: 0

Views: 218

Answers (2)

James Brown
James Brown

Reputation: 37424

All awk:

$ awk -v rev_p_client_pa="$rev_p_client_pa" \
      -v lawn_p_client="$lawn_p_client" '        # "tuples" in as vars
BEGIN {
    split(lawn_p_client,l,/\n/)                  # split the "tuples" by \n
    n=split(rev_p_client_pa,r,/\n/)              # get count of the other
    for(i=1;i<=n;i++)                            # loop the elements
        print r[i]*l[i]                          # multiply and output
}'

Output:

0.948607
0.912663
0.416161
0.670415
0.432672
0.496895
1.01407

Upvotes: 2

Ruud Helderman
Ruud Helderman

Reputation: 11018

Use paste to join the two data sets together, forming a list of pairs, each separated by tab. Then pipe the result to awk to multiply each pair of numbers, resulting in a list of products.

#!/bin/bash

rev_p_client_pa='0.018183
0.0202814
0.013676
0.0134083
0.0108168
0.014197
0.0202814'

lawn_p_client='52.17
45
30.43
50
40
35
50'

paste <(echo "$rev_p_client_pa") <(echo "$lawn_p_client") | awk '{print $1*$2}'

Output:

0.948607
0.912663
0.416161
0.670415
0.432672
0.496895
1.01407

Upvotes: 2

Related Questions