テーブルの作成クエリを含む.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番目の行のすべての項目を削除します。
- 唯一の)行に達するまでこれを行います。