Abaixo está o cenário
Eu tenho um arquivo de lista onde tenho um arquivo de lista com nomes de tabelas, digamos 10 tabelas e tenho outro arquivo com todos os DDLs criados, cerca de 100.
Preciso extrair create DDLS do segundo arquivo para as tabelas que existem no primeiro arquivo. Eu consegui isso usando sed
o comando. No entanto, corri para o problema onde meu comando está copiando duas vezes para algumas tabelas e também para algumas extras que não estão no primeiro arquivo
Para ex;
meu List_File.txt
tem
ACASE
ABC
ABCH
CREATE_DDLS.txt
tem
CREATE TABLE <SCHEMA_NAME>.ACASE
(
COLUMN1,
COLUMN2,
COLUMN3
) ;
CREATE TABLE <SCHEMA_NAME>.ACASE01
(
COLUMN1,
COLUMN2,
COLUMN3
) ;
CREATE TABLE <SCHEMA_NAME>.ACASE03
(
COLUMN1,
COLUMN2,
COLUMN3
);
CREATE TABLE <SCHEMA_NAME>.ABC
(
COLUMN1,
COLUMN2,
COLUMN3
) ;
CREATE TABLE <SCHEMA_NAME>.ABCD
(
COLUMN1,
COLUMN2,
COLUMN3
) ;
Cenário 1:
ACASE existe no arquivo de lista e há ACASE/ACASE01/ACASE03 no segundo arquivo, o comando abaixo está copiando todas as três tabelas onde preciso apenas ACASE criar DDL para a saída.
Cenário 2:
ABC e ABCD existem no arquivo de lista, o comando está gerando a tabela ABCD duas vezes, onde preciso de apenas um ABCD.
Abaixo está o comando que estou executando
while read -r line
do
sed -n '/CREATE TABLE SCHEMANAME.TABLENAME/,/\;/p' Create DDLS file
done < List file > NewFile.txt
Qualquer ajuda é muito apreciada.
Obrigado
Responder1
Seu exemplo e/ou tentativa está errado.
De qualquer forma, se eu pegar seu arquivo de exemplo, seu script provavelmente poderia ser
while read -r line; do
sed -n "/CREATE TABLE <SCHEMA_NAME>.$line/,/;/p" CREATE_DDLs.txt ;
done < List_File.txt
e corresponderá a todos os registros, porque ACASE
também corresponderá a ACASE01
. Use $
como âncora para o final da linha:
while read -r line; do
sed -n "/CREATE TABLE <SCHEMA_NAME>.$line$/,/;/p" CREATE_DDLs.txt ;
done < List_File.txt
Dito isto, para uma lista mais longa de tabelas, não é muito eficiente verificar o arquivo inteiro repetidamente, enquanto com expressões regulares estendidas você pode procurar por algo como (ACASE|ABC|ABCH)
, então coloque o primeiro arquivo no formato correto e use-o na pesquisa padrão:
TABLES=$(cat List_File.txt|tr '\n' '|')
sed -nE "/CREATE TABLE <SCHEMA_NAME>.(${TABLES%|})$/,/;/p" CREATE_DDLs.txt
O tr
irá substituir todas as novas linhas por barras OR enquanto a %|
expansão da variável removerá a barra final.
Responder2
Você poderia fazer algo assim usando *modo de parágrafo" no GNU awk:
gawk '
NR==FNR{tbl["CREATE TABLE <SCHEMA_NAME>." $1]; next} ($1 in tbl){ORS=RT; print}
' List_File.txt RS= FS='\n' CREATE_DDLS.txt
CREATE TABLE <SCHEMA_NAME>.ACASE
(
COLUMN1,
COLUMN2,
COLUMN3
) ;
CREATE TABLE <SCHEMA_NAME>.ABC
(
COLUMN1,
COLUMN2,
COLUMN3
) ;
Você pode fazer essencialmente o mesmo em qualquer awk, exceto que você não terá acesso, RT
então precisará definir ORS
algo fixo como\n\n