FROMとWHEREという単語の間のすべての項目を見つけます(単語自体は除く)。パターンは複数回発生する可能性があります。

FROMとWHEREという単語の間のすべての項目を見つけます(単語自体は除く)。パターンは複数回発生する可能性があります。

ファイルからSQLキーワードFROMとWHEREの間のすべての内容を抽出する必要があります。 FROMとWHEREはさまざまな方法で組み合わせることができます。また、大文字と小文字を区別せずに一致する必要があります。 SQLファイルは次のとおりです。

    SELECT col1 as column1,
    Col2 as column2,
    Col3 as column3,
      (SELECT t1.col4
      from table_1 t1, table_3 t3
      WHERE t1.col5 = t2.col6
      AND t1.col2 = t3.col11
      ) as column4
    FROM
    table_2 t2,
    table_4 t4
    where t2.col7 ='Active'
    AND t2.col12 = t4.col13
    AND t2.col8 IN ('abc','def','ghi')
    AND t2.col8||''||t2.col9 <> 'jkl'
    AND t2.col10 IS NULL;

必要な出力は次のようになります。

table_1 t1
table_3 t3
table_2 t2
table_4 t4

次のことを試みましたが、問題はほとんど解決されましたが、「FROM」の次の行にテーブル名が表示されると、テーブル名が壊れ、出力として印刷されません。

#!/bin/sh
    awk '
    BEGIN {IGNORECASE=1} { found = 0; }
    /FROM/ {
        if (!found) {
            found = 1;
            $0 = substr($0, index($0, "FROM") + 4);
        }
    }
    /WHERE/ {
        if (found) {
            found = 2;
            $0 = substr($0, 0, index($0, "WHERE") - 1);
        }
    }   
        { if (found) {
            print;
            if (found == 2)
                found = 0;
        }
    }
    '

ベストアンサー1

さまざまな拡張(IGNORECASE、、、、、、、複数文字、および\s\<でGNU awkを使用してください。\>RSgensub()

$ cat tst.awk
BEGIN {
    IGNORECASE = 1
    RS = "\\s*\\<where\\>\\s*"
}
sub(/.*\<from\>\s*/,"") {
    print gensub(/\s*,\s*/,ORS,"g")
}

$ awk -f tst.awk file
table_1 t1
table_3 t3
table_2 t2
table_4 t4

おすすめ記事