awk
на помощь!
на основании размещенного ввода / вывода и неявных предположений ...
$ awk '/^A/ {ia=1; c=0}
ia {a[c++]=$2}
/^[B-Z]/ {ia=c=0}
!ia && NF>1 {t=$2; $2-=a[++c]; a[c]=t}1' file
A
322 0.2
322 0.2
322 0.2
B
455 0.15
455 0.15
455 0.15
C
566 0.57
566 0.57
566 0.57
A
322 0.18
322 0.18
322 0.18
B
455 0.15
455 0.15
455 0.15
C
566 0.66
566 0.66
566 0.66
записи под каждым заголовком могут быть разными, но предполагается, что столько же записей.
Если ваш реальный вклад не представлен этим образцом, вам может потребоваться настроить условия.
Пояснение
/^A/ {ia=1; c=0}
если метка начинается с A
, установите индикатор A ai
, сбросьте счетчик.
ia {a[c++]=$2}
если в A, сохраните значения для каждой записи
/^[B-Z]/ {ia=c=0}
для других меток , сброс в A и счетчик
!ia && NF>1 {t=$2; $2-=a[++c]; a[c]=t}
, если не в A и не в метке (количество полей больше одного), сохранить числовое значение, сместить ранее сохраненное значение для соответствующей записи, сохранить временное значение в качестве нового значения смещения для позиции записи.
1
print