我有一个 .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 )
解释
- 模式空间在任何给定时间都有两条线。
- 我们保留第一个字段并删除第二行中的所有内容。
- 这样做直到我们到达唯一的 ) 行。