Извлечь столбцы таблицы из запроса на создание таблицы

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

0
14.05.2017, 17:03
2 ответа

Это должно работать

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 будет хранить первый экземпляр каждой строки, исходя из этого, вы можете выбрать, сохранять линии или нет

0
28.01.2020, 04:46
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-й строки.
  • Делайте это, пока мы не наткнемся на одинокую ) строку.
0
28.01.2020, 04:46

Теги

Похожие вопросы