CREATE VIEWで始まり、「;」で終わる段落で「FROM」パターンを検索し、結果をcsvファイルに保存したいと思います。たとえば、次のファイルがあるとします。
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
;
私は次の結果が欲しい:
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
答え1
編集:最初の行を忘れました(それでL ++を++ Lに変更しました):編集2:最後のFROMより前の角括弧を「グローバル化」しないように正規表現を修正しました。
フィールド分離を「生成的に」使用して、維持したくない項目を削除し、テーブル名のみを検索できます。
$ 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] } }'
それから餌を与えます。
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
;
予想される結果は次のとおりです。
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
注:私たちは「FROM」を含む行のみを処理するので、FROM行(複数行...)を使用して創造性を発揮する場合、少しの魔法なしでは動作しません。
答え2
TxR解決策:
@(define word (w))@{w /[^,\s()]+/}@(end)
@(collect)
@ (cases)
CREATE VIEW @view@/ /
@ (or)
CREATE VIEW @view
@ (end)
@ (collect)
@ (coll :vars (table))@\
FROM @(word first-tbl)@\
@(coll :vars (rest-tbl) :gap 0)@\
@/\s*,\s*/@(word rest-tbl)@\
@(maybe) as @(word something)@(end)@\
@(end)@\
@(merge table first-tbl rest-tbl)@\
@(end)
@ (until)
CREATE@(skip)
@ (end)
@ (flatten table)
@(end)
@(output)
@ (repeat)
@ (repeat)
@view;@table
@ (end)
@ (end)
@(end)
ランニング:
$txr .txr データ抽出 例1; 表2を見る 表3を見る 例1; 例1; 例1; 例2; 例2; 例2; 例2; 例2; 例2; 例2; 例2; 例2;
as
として表示される場合は、AS
たとえばを使用してコードに書き込む必要があります@/[Aa][Ss]/
。