awk /sed는 패턴이 단락과 일치할 때 정보를 추출합니다.

awk /sed는 패턴이 단락과 일치할 때 정보를 추출합니다.

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]/.

관련 정보