Умножение двух переменных, содержащих кортежи, в скрипте BASH - PullRequest
0 голосов
/ 09 марта 2020

У меня есть две переменные, содержащие кортежи одинаковой длины, сгенерированные из базы данных PostgreSQL, и несколько успешных последующих вычислений, которые я хотел бы умножить, чтобы сгенерировать третью переменную, содержащую кортеж ответа. Каждый кортеж содержит 100 числительных c записей. Переменная 1 называется rev_p_client_pa , а переменная 2 называется lawnp_p_client . Я попробовал следующее, что дает мне третий кортеж, но строки ответов не рассчитаны правильно:

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

Команда, которую я использовал в сценарии:

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

Команда выдает следующие выходные данные:

0.948607
1.05808
0.713477
0.699511
0.564312
0.740657
1.05808

Однако при вычислении вручную в libreoffice cal c я получаю:

0.94860711
0.912663
0.41616068
0.670415
0.432672
0.496895
1.01407

Я использовал эту структуру awk, чтобы умножить переменную кортежа на значение переменной Numberri c в предыдущем расчете, и она рассчитана правильно. Кто-нибудь знает, как правильно написать заявление на awk, или, может быть, у вас есть другие идеи, которые могут быть полезны? Спасибо за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 10 марта 2020

Все 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
}'

Вывод:

0.948607
0.912663
0.416161
0.670415
0.432672
0.496895
1.01407
2 голосов
/ 09 марта 2020

Используйте paste , чтобы объединить два набора данных, образуя список пар, каждая из которых разделена табуляцией. Затем перенаправьте результат в awk, чтобы умножить каждую пару чисел, чтобы получить список продуктов.

#!/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}'

Вывод:

0.948607
0.912663
0.416161
0.670415
0.432672
0.496895
1.01407
...