У меня есть файл .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 столбцов. Не самая лучшая идея писать это вручную . Может кто-нибудь предложить более простой способ? Спасибо!
Это должно работать
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 будет хранить первый экземпляр каждой строки, исходя из этого, вы можете выбрать, сохранять линии или нет
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 )