Aqui está outro jeito estranho (que, vejo agora, é apenas uma versão mais feia do @Costas's):
$ awk -F'[- ]' '($1~/name/){k=$2}($1~/school/){print k,$NF}' file
JOHN NY
TOM TX
LILLY LA
ROSY WA
Você também pode usar grep
:
$ grep -oP '^(name-\K\S+|school.*\s+\K.*)' file | paste - -
JOHN NY
TOM TX
LILLY LA
ROSY WA
Em seu exemplo específico, é claro, você pode procurar por letras maiúsculas:
$ grep -Eo '[A-Z]{2,}' file | paste - -
Ou perl:
$ perl -lne '$n=$1 if /^name-(\S+)/; /^school.*\s+(.+)/ && print "$n\t$1"' file
Ou outro perl:
$ perl -007ne 'print join "\n", (/name-(\S+?)\s.*?state\s+(..)\n/gsm)' file | paste - -