Sabendo dos detalhes do que contém cada tabela e do arquivo de texto, utilizando as ferramentas do Shell, devemos separar as informações que queres em outros arquivos de texto e depois fazer a junção de tudo gerando o código necessário dos inserts e agregando ao arquivo SQL.
Vamos começar criando a tabela Autores onde precisamos criar um ID e pegar os nomes necessários.
Primeiro vou criar um arquivo chamado números, que armazenará todos os IDs usados tanto nas tabelas Autores como Editoras.
Criando uma variável global para guardar o total de registros:
TOTAL=$(cut -d':' -f3 lista_livros.txt | wc -l)
Em seguida, gero o arquivo números com o comando
seq aproveitando a variável $TOTAL:
seq $TOTAL >> numeros
Agora é a vez de criar o arquivo autores. O campo três contém o nome do autor:
cut -d':' -f3 lista_livros.txt >> autores
Pronto! Vou concatenar esses dois arquivos gerando o novo arquivo autores:
paste -d':' numeros autores >> newautores
mv newautores autores
Feito! Já estamos quase lá. Agora é agora de acrescentar os inserts ao arquivo db_livros.sql. Para isso, criei o script insert.sh:
#!/bin/bash
#
# $1 = arquivo com os dados já formatados
#
IFS=:
while read id nome;do
echo
echo "INSERT INTO tbl_AUTORES VALUES('$id', '$nome');" >> db_livros.sql
done < $1
Este script vai ler o conteúdo do arquivo passado na variável $i e vai criar o código de insert dentro do arquivo db_livros.sql.
Execute o arquivo dessa forma:
./insert.sh autores
Confira o arquivo db_livros e veja no final deste os códigos gerados.
Usando as técnicas anteriores, criaremos o arquivo editoras:
cut -d':' -f5 lista_livros.txt >> editoras
$ paste -d':' numeros editoras >> neweditoras
$ mv neweditoras editoras
Altere o arquivo insert.sh afim de atender a criação dos códigos que irão popular a tabela editoras. Veja como ficou o script:
#!/bin/bash
#
# $1 = arquivo com os dados já formatados
#
IFS=:
while read id nome;do
echo
echo
echo "INSERT INTO tbl_EDITORAS VALUES('$id', '$nome');" >> db_livros.sql
done < $1
A mudança foi apenas no nome da tabela onde ocorrerá os inserts.
./insert.sh editoras
Este artigo não tem como finalidade abordar a linguagem SQL afundo, mas quero salientar que a próxima e última tabela livros possui dados relacionados com as tabelas anteriores. Sendo assim, caso tivéssemos começado a criação dos códigos por ela, após a importação, iria gerar erros de relacionamento.
Vamos repetir os mesmo passos para a criação dos códigos para a tabela livros que conterá mais campos.
cut -d':' -f2,1,8,10 lista_livros.txt >> livros
No comando
paste, vou inverter a ordem dos arquivos para casar certinho com os campos ID_AUTOR e ID_EDITORAS da tabela livros. Dessa forma, os comandos serão executados duas vezes cada:
paste -d':' livros numeros >> newlivros
$ mv newlivros livros
Repita novamente os comandos acima
paste -d':' livros numeros >> newlivros
$ mv newlivros livros
Edite o arquivo insert.sh de deixe dessa forma:
#!/bin/bash
#
# $1 = arquivo com os dados já formatados
#
IFS=:
while read isbn nome ano preco autor editora ;do
echo
echo
echo "INSERT INTO tbl_LIVRO (ISBN, NOME, ANO, PRECO, ID_AUTOR, ID_EDITORA) VALUES('$isbn', '$nome', '$ano', '$preco', $autor, $editora);" >> db_livros.sql
done < $1
Talvez você não tenha percebido, mas quando executamos o comando cut, ele não nos retornou os valores na ordem que pedimos, ou seja, ele trouxe primeiro o ISBN e depois o nome. Dessa forma, fiz as devidas alterações no comando INSERT do nosso arquivo insert.sh. Eu informei a ordem correta dos campos para que não haja erro na hora da importação.