Вы пытаетесь сопоставить конец строки $
в начальном шаблоне, но в этой позиции во входных данных ничего нет. Также нарушается форматирование блока END
верхнего/нижнего колонтитула.
Слегка измененный код:
pattern='PPPA'
awk -v ptn="$pattern" '
$0 ~ "^WWWW " ptn " "{ save=1; header=$0; next }
save && $0 ~ "^HHHH " ptn " "{ save=0; footer=$0; sum+=$3; next }
save{ line[i++]=$0; next }
1 # print current record
END{
if (i){
print header
for (j=0;j<i;j++) print line[j]
$0=footer # assign footer to current record
$3=sum # replace 3rd field with sum
print # print footer
}
}
' file
Выход:
WWWW PPPB TTTT
XB XC
XY XE
HHHH PPPB 200 XXX1
WWWW PPPC TTTT
XX XY
XA XB
XB XC
HHHH PPPC 300 XXX9
WWWW PPPD TTTT
XX XY
XA XB
XB XC
XY XE
XN XA
HHHH PPPD 500 XXX4
WWWW PPPA TTTT
XA XB
XB XC
XY XE
XA XB
XB XC
XN XX
HHHH PPPA 700 XXX6
Модифицированный код для фактических данных со следующими изменениями:
WWW
и HHH
как первое поле, шаблон как второй (заголовок )или третий (нижний колонтитул )поле oldvalue
, используемое для замены этого значения на sum
в блоке END
sum
,oldvalue
)pattern='PPPA'
awk -v ptn="$pattern" '
$1=="WWW" && $2==ptn{ save=1; header=$0; next }
save && $1=="HHH" && $3==ptn{ save=0; oldvalue=$2; sum+=$2; footer=$0; next }
save{ line[i++]=$0; next }
1
END{
if (i){
print header
for (j=0;j<i;j++) print line[j]
sub(oldvalue, sum, footer) # replace oldvalue with sum
print footer
}
}
' file
Выход:
WWW PPPB TTTT XXXAAXX
XB XC
XY XE
HHH 3500 PPPB TTTT
WWW PPPC TTTT XXXAABB
XX XY
XA XB
XB XC
XY XE
XN XA
HHH 4000 PPPC TTTT
WWW PPPA TTTT XXXAAXX
XX XY
XA XB
XB XC
XY XE
XA XB
XB XC
XN XX
HHH 1500 PPPA TTTT