Вот решение awk
при условии, что вам не нужны пустые строки в выводе примера.
awk '/START_BLOCK_1/ { block1=$2; next; } \
/END_BLOCK_1/ {block1=""; next; } \
/START_BLOCK_2/ { block2=$2; next; } \
/./ { if(block1) {print block2 " " block1} if(block2) { print block2 " " $2}
}' inp
он работает, сопоставляя каждую строку для начального или конечного блока. Если мы находимся «в» BLOCK_1, у нас будет имя, установленное в переменной block1
. Если мы «находимся» в BLOCK_2, это имя будет установлено в переменной block2
. В любой строке, которая не определяет блок и не является пустой (соответствует как минимум 1 символу), мы затем распечатываем материал на основе блоков, в которых мы находимся.