Extrai colunas da tabela de uma consulta de criação de tabela

0

Eu tenho um arquivo .sql que tem uma consulta de criar tabela:

<<<<< some text >>>>>
CREATE EXTERNAL TABLE table_name
(
    key1                   int ,
    key2                varchar(256),
    key3                   int ,
    key4            varchar(64),
    key5                   int ,
)
<<<<<<< some text >>>>>>>>

Agora quero apenas os nomes das colunas em uma string separados por vírgulas e entre parênteses. Ou seja, para a tabela acima, quero:

( key1, key2, key3, key4, key5 )

Pelo que eu pensei, está ficando muito complicado. Eu quero script isso porque eu tenho 150 arquivos e alguns deles têm cerca de 300 colunas. Não é uma boa ideia escrever à mão. Alguém pode sugerir um método mais fácil? Obrigado!

    
por kskp 14.05.2017 / 16:02

2 respostas

0

Isso deve funcionar

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

Crie um script com este código e substitua "file.sql" pelo seu arquivo e você deve obter o que precisa

Claro que não conheço toda a estrutura do seu arquivo, mas adiciono cláusulas na instrução if se houver outras coisas que você deseja evitar

A variável temp armazenará a primeira instância de cada linha, com base em que você pode escolher se quer manter ou não as linhas

    
por 14.05.2017 / 18:16
0
sed -Ee '
   /^CREATE EXTERNAL TABLE/!d
   s/.*//
   :loop
      $!N
      s/(\n\()\n\s*(\S+).*\s.*\S.*/, /
   /\n\)$/!bloop
   s/(.*), \n\(\n\)$/(  )/
' filename.sql

Resultados

( key1, key2, key3, key4, key5 )

Explicação

  • O espaço do padrão tem duas linhas em um determinado momento.
  • Preservamos o primeiro campo e excluímos tudo da segunda linha.
  • Faça isso até chegarmos à linha solitária.
por 15.05.2017 / 07:02