ファイルから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を使用してください。\>
RS
gensub()
$ 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
答え2
どうですか....gと一緒ならawk
awk -F"from|FROM|where|WHERE" 'BEGIN{RS=""}{for (i=2;i<=NF;i+=2) print $i}' file |
tr "," "\n" | column -t
table_1 t1
table_3 t3
table_2 t2
table_4 t4
From / Whereなどの大文字と小文字が混在していない限り
awk -F"[fF]rom|FROM|[wW]here|WHERE"
または最後に
awk -F"[fF][rR][oO][mM]|[wW][hH][eE][rR][eE]"
しかし、それでは専門的な治療を受ける必要があります。
修正する
デフォルトcolumn
の区切り文字は2つのスペースです(ページ参照man
)。ただ1つのスペースが必要な場合は、単に使用してください
column -o" " -t