Как выполнять математические операции в одном столбце в bash и / или с помощью awk? - PullRequest
0 голосов
/ 03 января 2019

У меня есть столбец из нескольких строк, например:

20.000
15.000
42.500
42.500
45.000
45.000
50.000
50.000
50.000
50.000
50.000
50.000
50.000
50.000
50.000

, и мне нужно получить файл, где:

первый элемент равен 20/2

второй элемент - это предыдущее значение + 15/2

третий элемент - это предыдущие значения + 42,5 / 2

и так до конца

Моя проблема в том, каксделать "петлю".

Ответы [ 5 ]

0 голосов
/ 04 января 2019

просто,

$ awk '{print v+=$1/2}' file

10
17.5
38.75
60
82.5
105
130
155
180
205
230
255
280
305
330

Вы можете установить printf форматирование при необходимости

0 голосов
/ 03 января 2019

Я думаю, вы могли бы искать for петля

awk '{for (i = 1; i <= NF; i++) print  temp = temp + $i/2  }' filename

помните одну вещь, i относится к номеру столбца, если вы хотите выполнить эту операцию только в одном столбце, вы можете изменить значение

i = номер столбца; я <= номер столбца; </em>

Вы можете использовать этот цикл для сложного сценария.

Если вы хотите изменить разделитель, вы можете использовать такие параметры, как -F и разделитель.

awk -F ":" '{}' filename

enter image description here

0 голосов
/ 03 января 2019

Я думаю, вам нужно, чтобы вывод был в одну строку:

awk '{s+=$1/2; out = out s " ";} END{print out}' file
#=> 10 17.5 38.75 60 82.5 105 130 155 180 205 230 255 280 305 330

В конце есть дополнительный пробел, который, я думаю, не причинит вреда.
Вы можете удалить его, если не хотите.

0 голосов
/ 03 января 2019

Попробуйте это:

awk '{prev += ($0) / 2; printf("%.3f\n", prev);}' a2.txt 

Входные данные:

20.000
15.000
42.500
42.500
45.000
45.000
50.000
50.000
50.000
50.000
50.000
50.000
50.000
50.000
50.000

Выход:

10.000
17.500
38.750
60.000
82.500
105.000
130.000
155.000
180.000
205.000
230.000
255.000
280.000
305.000
330.000

0 голосов
/ 03 января 2019

Perl на помощь:

perl -lne 'print $s += $_ / 2' input-file > output-file
  • -l удаляет символы новой строки из ввода и добавляет их в вывод
  • -n читает строку ввода построчно, выполняя код для каждого
  • $_ - значение, считываемое с каждой строки
  • / 2 делится на 2
  • += - оператор, который добавляет свою левую сторону к левой стороне и сохраняет результат в левой части, возвращая новое значение. Я назвал переменную $s как "sum".
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...