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 sed
el 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.txt
tiene
ACASE
ABC
ABCH
CREATE_DDLS.txt
tiene
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 ACASE
tambié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á tr
todas 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, RT
por lo que tendrás que configurar ORS
algo fijo como\n\n