Разделите поле на поле в предыдущем ряду с помощью awk - PullRequest
0 голосов
/ 28 марта 2020

Я пытаюсь выполнить операцию с полем в строке CSV, используя поле из предыдущей строки, а затем добавить результат в качестве нового поля в CSV. Но я не могу найти правильный способ достижения этого.

Пример входных данных:

2020-03-05,21
2020-03-06,58
2020-03-07,107
2020-03-08,162

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

2020-03-05,21,0
2020-03-06,58,2.76
2020-03-07,107,1.84
2020-03-08,162,1.51

То, что я уже пробовал:

awk -F, '{ if ( NR > 2 ) { result = $2/"field_$2_from_previous_row"; print $0","result; }}'

Я бы хотел найти способ сопоставить поле в предыдущем ряду. (Я знаю, что следующим шагом будет, конечно, избежать деления на ноль).

Заранее спасибо!

Ответы [ 4 ]

3 голосов
/ 28 марта 2020
$ cat tst.awk
BEGIN { FS=OFS=","; OFMT="%.2f" }
{
    print $0, (prev ? $2 / prev : 0)
    prev = $2
}

$ awk -f tst.awk file
2020-03-05,21,0
2020-03-06,58,2.76
2020-03-07,107,1.84
2020-03-08,162,1.51
0 голосов
/ 28 марта 2020

data.txt ваши данные, скрипт s.awk о содержании:

// {
if (NR == 1) {
  r=0
}
else {
  r=sprintf("%.2f", $2/tmp)
}
print($0","r)
tmp=$2
}

Выполнение:

awk -F, -f s.awk data.txt

Результат:

2020-03-05,21,0
2020-03-06,58,2.76
2020-03-07,107,1.84
2020-03-08,162,1.51
0 голосов
/ 28 марта 2020

Простой способ (не единственный способ) - просто сохранить значение 2-го поля в n, и, если оно установлено, вывести дополнительное поле, которое является результатом $2/n, если оно не ' t установить, вывести запись без изменений, добавив 0, например,

awk -F, 'n{printf "%s,%.2f\n",$0,$2/n;n=$2;next} {print $0","0; n=$2}' file

Пример использования / Вывод

Использование ваших данных в file:

$ awk -F, 'n{printf "%s,%.2f\n",$0,$2/n;n=$2;next} {print $0","0; n=$2}' file
2020-03-05,21,0
2020-03-06,58,2.76
2020-03-07,107,1.84
2020-03-08,162,1.51

Альтернативная более короткая версия, использующая троичный (в два раза) для управления выводом:

awk -F, '{printf n?"%s,%.2f\n":"%s,%d\n",$0,n?$2/n:0;n=$2}' file

В зависимости от того, что вам больше подходит.

0 голосов
/ 28 марта 2020

Как насчет этого?

awk -F, '{
    if (NR>1) result=$2/field2
    print $0","result
    field2=$2
}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...