Третий вариант в awk
может быть:
awk '$1~/^[A-Z]+$/ {lbl=$1}; {a[lbl]=$1}; END {for(i in a) print i,"|",a[i]}' file
Пояснение
Приведенная выше команда awk
имеет 3 правила:
$1~/^[A-Z]+$/ {lbl=$1}
, если первое поле все в верхнем регистре, сохраните файл в lbl
(для метки). Это выполняется только в том случае, если все поле 1 имеет верхний регистр; {a[lbl]=$1}
устанавливает массив a[lbl]
равным первому полю (выполняется для всех записей);и END {for(i in a) print i,"|",a[i]}
в конце обработки всех записей циклически перебирайте все элементы в вашем массиве a
, выводя последнее сохраненное значение для метки.
По сути, выпросто сохраняйте первое поле в a[lbl]
, где lbl
- это последнее из всех заглавных букв. Результат: a[lbl]
содержит последнее первое поле, видимое под каждой меткой.
Пример Использование / Вывод
С вашими данными в file
, затем
$ awk '$1~/^[A-Z]+$/{lbl=$1}; {a[lbl]=$1}; END { for(i in a) print i,"|",a[i] }' file
ABC | a.b.c.d
PQR | x.y.z
XYZ | p.q.r