O awk só executa o arquivo uma vez por padrão, executando todos os blocos em ordem, e é por isso que ele fornece a saída que você obteve. Você pode obter o comportamento desejado usando uma matriz para salvar as linhas como você vai, enquanto ainda apenas o processamento do arquivo uma vez:
BEGIN {
AgeIndex = 1
HeightIndex = 1
}
/Age/ {
ages[AgeIndex] = $0
AgeIndex+=1
}
/Height/ {
heights[HeightIndex] = $0
HeightIndex+=1
}
END {
for (x = 1; x < AgeIndex; x++)
print ages[x] "\n"
for (x = 1; x < HeightIndex; x++)
print heights[x] "\n"
}
Salve em filter.awk
e execute:
awk -f filter.awk output.txt > output2.txt
para obter a saída desejada:
$ awk -f filter.awk < data
Age 1
Age 2
Height 1
Height 2
O que estamos fazendo é criar dois arrays ages
e heights
e salvar cada linha correspondente neles. AgeIndex
detém até que ponto a matriz está fazendo. No final, estamos imprimindo todas as linhas que salvamos (e uma nova linha extra como você quer), primeiro todas as idades, depois todas as alturas.
As matrizes armazenarão o arquivo inteiro na memória até o final, portanto, se o seu arquivo for particularmente grande, você terá que trocar o uso da memória pelo tempo de passar pelo arquivo inteiro mais de uma vez. Neste ponto, é essencialmente o mesmo que um programa em qualquer outro idioma - se você não tem nenhum motivo particular para usar o awk, você pode preferir outro idioma. Para ser honesto, acho que recomendo isso - o awk não está te comprando muito aqui.