Quiero imprimir la línea que comienza con una palabra particular y en el resto de los registros imprimir solo el primer campo.

Quiero imprimir la línea que comienza con una palabra particular y en el resto de los registros imprimir solo el primer campo.

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 TABLEal 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 donde perlactúa sobre toda la entrada en su conjunto.
  • -pe 'code': sedmodo. (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) $2con 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_#");

información relacionada