eu quero imprimir a linha que começa com uma palavra paricular e nos registros restantes imprimir apenas 1º campo

0

por exemplo:

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

No exemplo acima eu quero imprimir a linha que começa com CREATE TABLE e na linha restante imprimir apenas o primeiro campo.

Eu quero saída como

CREATE TABLE MWWDATA."VTCat02" ("ID","Cat","Style_code","Vendor_Style_#");
    
por TOM 02.11.2015 / 13:57

3 respostas

2

com awk :

awk '/^CREATE TABLE/{
       inside = 1
       sep = ""
       printf "%s", $0
       next
     }
     inside {
       printf "%s", sep $1
       sep = ","
       if (/\);$/) {
         print ");"
         inside = 0
       }
     }'

Esse depende das instruções que começam com CREATE TABLE no início da linha e terminam com ); no final de uma linha (embora não na mesma linha) e cada nome de coluna é o primeiro campo de subsequente linhas (o que significa que os nomes das colunas não podem conter espaços em branco).

    
por 02.11.2015 / 14:26
1

Parece mais um trabalho para perl :

perl -0777 -pe 's{(CREATE TABLE \S+\s+)\K(\((?:(?2)|.)*?\))}
  {"(" . join(",", $2 =~ /".*?"/g) . ")"}gse'

(Isso pressupõe que as strings entre aspas não contêm parênteses sem correspondência e uma versão razoavelmente recente de perl ).

Detalhado:

  • -0777 , defina o separador de registro como 0777 (um valor de byte impossível), então, de fato, ativa o modo slurp , em que perl atua em toda a entrada como um todo.
  • -pe 'code' : sed mode. ( e avalia o código e xpression um registro por vez e p o pressiona posteriormente)
  • s{...}{...}gse : substitua g lobally, trata string como linha s ( . também corresponde a caracteres newline), e a substituição deve ser tratada como um perl e xpression para e avaliar
  • \K : mar k s o começo da parte a ser substituída.
  • (?2) : uma maneira de fazer regexp recursiva. Aqui inclui o regexp incluído no segundo grupo (...) . Então, \((:(?2)|.)*?\) . É um ( seguido por uma sequência de mais (...) grupos ou outros caracteres (o mínimo possível) seguido por ) .
  • join(",", $2 =~ /".*?"/g) une a lista de strings que correspondem a ".*?" (ou seja, strings entre aspas) em $2 com uma vírgula.
por 02.11.2015 / 14:08
0

Usando awk :

awk '{if (NR==1) {printf "%s", $0} else {printf "%s,",$1}} END {printf "^H);\n"}' /tmp/inputfile
Primeira correspondência, se estivermos na primeira linha de entrada, se assim for, imprima toda a linha, senão imprima a primeira palavra seguida por uma vírgula.

Como etapa final, imprima um backspace para eliminar a última vírgula e imprima a chave de fechamento e uma nova linha. O caractere backspace é inserido na linha de comando usando ctrl + v ctrl + h . A tecla ctrl + h corresponde à oitava letra do alfabeto (H) e o código 8 corresponde a um backspace.

A saída será:

CREATE TABLE MWWDATA."VTCat02" ("ID","Cat","Style_Code","Vendor_Style_#");
    
por 02.11.2015 / 14:15