テーブル生成クエリからテーブル列を抽出する

テーブル生成クエリからテーブル列を抽出する

テーブルの作成クエリを含む.sqlファイルがあります。

<<<<< some text >>>>>
CREATE EXTERNAL TABLE table_name
(
    key1                   int ,
    key2                varchar(256),
    key3                   int ,
    key4            varchar(64),
    key5                   int ,
)
<<<<<<< some text >>>>>>>>

ここで、カンマで区切って角かっこで囲んだ文字列の列名が必要です。つまり、上記のテーブルについては、次のようにしたいと思います。

( key1, key2, key3, key4, key5 )

私が考えているように、状況は非常に複雑になります。このようなファイルが150個あり、そのうち列が約300個あるファイルはほとんどないので、このスクリプトを作成したいと思います。手書きは良い考えではありません。誰かがより簡単な方法を提案できますか?ありがとうございます!

答え1

これはうまくいきます

Old_IFS=$IFS
IFS=$'\n'

file=`cat file.sql` > /dev/null

for line in $file
do

    temp=`echo "$line" | awk '{print $1}'`


    if [[ "$temp" == "create" ]] || [[ "$temp" == "" ]]
    then
        echo ""

    elif [[ "$temp" == "(" ]]
    then
        printf "$temp"
    elif [[ "$temp" == ")" ]]
    then
        printf "$temp\n"
    else
        printf "$temp,"
    fi
done

IFS=$Old_IFS


exit 0

このコードを使用してスクリプトを生成し、「file.sql」をファイルに置き換えると、必要なものが得られます。

もちろん、ファイルの全体的な構造はわかりませんが、他のことを避けたい場合は、if文に句を追加してください。

temp変数は各行の最初のインスタンスを格納し、それに基づいて行を保持するかどうかを選択できます。

答え2

sed -Ee '
   /^CREATE EXTERNAL TABLE/!d
   s/.*//
   :loop
      $!N
      s/(\n\()\n\s*(\S+).*\s.*\S.*/\2, \1/
   /\n\)$/!bloop
   s/(.*), \n\(\n\)$/( \1 )/
' filename.sql

結果

( key1, key2, key3, key4, key5 )

説明する

  • パターン空間には、所与の時間に2本の線がある。
  • 最初のフィールドを維持し、2番目の行のすべての項目を削除します。
  • 唯一の)行に達するまでこれを行います。

関連情報