从创建表查询中提取表列

从创建表查询中提取表列

我有一个 .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 )

解释

  • 模式空间在任何给定时间都有两条线。
  • 我们保留第一个字段并删除第二行中的所有内容。
  • 这样做直到我们到达唯一的 ) 行。

相关内容