Editar: esqueci a primeira linha (então mudei o L ++ para o ++ L): Edit2: regexp fixo para não "glob" o parêntese inteiro até o último FROM
Poderemos usar "criativamente" as separações de campo para eliminar o que não queremos manter e apenas recuperar os nomes das tabelas:
$ LC_ALL="C" awk -v csvsep=';' -v separators='FROM *| *, *| +as[^,]*| *[(][^()]*FROM *| *[)] *' '
/CREATE VIEW/ { name=$NF }
/FROM / { nb=split($0,tables,separators);
for(i=1;i<=nb;i++) {
(tables[i]~/[A-Za-z]/) ? line[++L]=name csvsep tables[i] : rem="Otherwise nothing to add" }
}
END { for(i=1;i<=L;i++) { print line[i] } }'
Então nós o alimentamos:
CREATE VIEW view1
AS something
FROM table1 ,table2 as A, table3 (something FROM table4)
FROM table5, table6
USING file1
;
CREATE VIEW view2
FROM table1 ,table2 ,table6 ,table4
something
something
FROM table5 ,table7 (something FROM table4 ,table5(this is something FROM table8)
USING file2
;
E isso dá o esperado:
view1;table1
view1;table2
view1;table3
view1;table4
view1;table5
view1;table6
view2;table1
view2;table2
view2;table6
view2;table4
view2;table5
view2;table7
view2;table4
view2;table5
view2;table8
Observação: apenas processamos linhas que contenham "FROM", por isso, se você tiver linhas criativas FROM (em várias linhas ...), isso não funcionará sem um pouco mais de mágica.