¿Alguien puede ayudarme a lograr uno de los escenarios complejos moderados utilizando los comandos sed o awk?

¿Alguien puede ayudarme a lograr uno de los escenarios complejos moderados utilizando los comandos sed o awk?

A continuación se muestra el escenario.

Tengo un archivo de lista donde tengo un archivo de lista con nombres de tablas, digamos 10 tablas y tengo otro archivo con todos los DDL creados alrededor de 100.

Necesito extraer y crear DDLS desde el segundo archivo para las tablas que existen en el primer archivo. Lo he logrado usando sedel comando. Sin embargo, me encontré con un problema en el que mi comando se copia dos veces para algunas tablas y también para algunas tablas adicionales que no están en el primer archivo.

Por ejemplo;

mi List_File.txttiene

ACASE
ABC
ABCH

CREATE_DDLS.txttiene

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
) ;

Escenario 1:

ACASE existe en el archivo de lista y hay ACASE/ACASE01/ACASE03 en el segundo archivo, el siguiente comando copia las tres tablas donde solo necesito que ACASE cree DDL en la salida.

Escenario 2:

ABC y ABCD existen en el archivo de lista, el comando genera la tabla ABCD dos veces donde solo necesito un ABCD.

A continuación se muestra el comando que estoy ejecutando.

while read -r line
 do
  sed -n '/CREATE TABLE SCHEMANAME.TABLENAME/,/\;/p' Create DDLS file
done < List file > NewFile.txt

Cualquier ayuda es muy apreciada.

Gracias

Respuesta1

Su ejemplo y/o intento es incorrecto.

De todos modos, si tomo su archivo de ejemplo, su script probablemente podría ser

while read -r line;  do
  sed -n "/CREATE TABLE <SCHEMA_NAME>.$line/,/;/p" CREATE_DDLs.txt ;
done < List_File.txt

y coincidirá con todos los registros, porque ACASEtambién coincidirá ACASE01. Úselo $como ancla para el final de línea:

while read -r line;  do
  sed -n "/CREATE TABLE <SCHEMA_NAME>.$line$/,/;/p" CREATE_DDLs.txt ;
done < List_File.txt

Dicho esto, para una lista más larga de tablas, no es muy eficiente escanear todo el archivo una y otra vez, mientras que con expresiones regulares extendidas puedes buscar algo como (ACASE|ABC|ABCH), así que coloca ese primer archivo en el formato correcto y úsalo en la búsqueda. patrón:

TABLES=$(cat List_File.txt|tr '\n' '|')
sed -nE "/CREATE TABLE <SCHEMA_NAME>.(${TABLES%|})$/,/;/p" CREATE_DDLs.txt

Reemplazará trtodas las nuevas líneas con barras OR, mientras que %|en la expansión variable eliminará la barra final.

Respuesta2

Podrías hacer algo como esto usando *modo párrafo" en 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
) ;

Puedes hacer esencialmente lo mismo en cualquier awk, excepto que no tendrás acceso a él, RTpor lo que tendrás que configurar ORSalgo fijo como\n\n

información relacionada