Alguém pode me ajudar a alcançar um cenário complexo moderado usando comandos sed ou awk?

Alguém pode me ajudar a alcançar um cenário complexo moderado usando comandos sed ou awk?

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 sedo 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.txttem

ACASE
ABC
ABCH

CREATE_DDLS.txttem

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 ACASEtambé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 trirá 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, RTentão precisará definir ORSalgo fixo como\n\n

informação relacionada