por ejemplo:
CREATE TABLE MWWDATA."VTCat02" (
"ID" NUMBER(10) DEFAULT NULL ,
"Cat" VARCHAR2(255) DEFAULT NULL ,
"Style_Code" VARCHAR2(255) DEFAULT NULL ,
"Vendor_Style_#" VARCHAR2(255) DEFAULT NULL );
En el ejemplo anterior quiero imprimir la línea que comienza con CREAR TABLA y en la línea restante imprimir solo el primer campo.
quiero resultados como
CREATE TABLE MWWDATA."VTCat02" ("ID","Cat","Style_code","Vendor_Style_#");
Respuesta1
Con awk
:
awk '/^CREATE TABLE/{
inside = 1
sep = ""
printf "%s", $0
next
}
inside {
printf "%s", sep $1
sep = ","
if (/\);$/) {
print ");"
inside = 0
}
}'
Ese se basa en aquellas declaraciones que comienzan CREATE TABLE
al principio de la línea y terminan al );
final de una línea (aunque no son la misma línea) y cada nombre de columna es el primer campo de las líneas posteriores (lo que significa que los nombres de las columnas no pueden contener espacios en blanco).
Respuesta2
Suena más como un trabajo para perl
:
perl -0777 -pe 's{(CREATE TABLE \S+\s+)\K(\((?:(?2)|.)*?\))}
{"(" . join(",", $2 =~ /".*?"/g) . ")"}gse'
(Eso supone que las cadenas entrecomilladas no contienen paréntesis no coincidentes y una versión razonablemente reciente de perl
).
Desglosado:
-0777
, establezca el separador de registros en 0777 (un valor de byte imposible), por lo que, de hecho, activa elsorbermodo dondeperl
actúa sobre toda la entrada en su conjunto.-pe 'code'
:sed
modo. (mivalora el códigomixpression un registro a la vez ypaglo imprime después).s{...}{...}gse
: sustitutogramoglobalmente, trata la cuerda comosuna sola línea (.
también coincide con caracteres de nueva línea), y la sustitución debe tratarse como un perlmiexpresión amivalorar.\K
: marks el inicio de la pieza a sustituir.(?2)
: una forma de hacer expresiones regulares recursivas. Aquí se incluye la expresión regular incluida en el segundo(...)
grupo. Entonces\((:(?2)|.)*?\)
. Va(
seguido de una secuencia de más(...)
grupos u otros personajes (tan pocos como sea posible) seguido de)
.join(",", $2 =~ /".*?"/g)
une la lista de cadenas que coinciden".*?"
(es decir, cadenas entre comillas)$2
con una coma.
Respuesta3
Usando awk
:
awk '{if (NR==1) {printf "%s", $0} else {printf "%s,",$1}} END {printf "^H);\n"}' /tmp/inputfile
Primera coincidencia si estamos en la primera línea de entrada; de ser así, imprima la línea completa; de lo contrario, imprima la primera palabra seguida de una coma.
Como paso final, imprima un espacio de retroceso para eliminar la última coma e imprima la llave de cierre y una nueva línea. El carácter de retroceso se inserta en la línea de comando usando ctrl+vctrl+h. La ctrl+hclave corresponde a la octava letra del alfabeto (H) y el código clave 8 corresponde a un retroceso.
La salida será:
CREATE TABLE MWWDATA."VTCat02" ("ID","Cat","Style_Code","Vendor_Style_#");