quero imprimir a linha que começa com uma palavra específica e nos demais registros imprimir apenas o 1º campo

quero imprimir a linha que começa com uma palavra específica e nos demais registros imprimir apenas o 1º campo

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 quero imprimir a linha que começa com CREATE TABLE e na linha restante imprimir apenas o primeiro campo.

Eu quero uma saída como

CREATE TABLE MWWDATA."VTCat02" ("ID","Cat","Style_code","Vendor_Style_#");

Responder1

Com awk:

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

Aquele se baseia nessas instruções começando CREATE TABLEno início da linha e terminando );no final de uma linha (embora não seja a mesma linha) e cada nome de coluna sendo o primeiro campo das linhas subsequentes (o que significa que os nomes das colunas não podem conter espaços em branco).

Responder2

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 citadas não contenham parênteses incomparáveis ​​e uma versão razoavelmente recente de perl).

Quebrado:

  • -0777, defina o separador de registro como 0777 (um valor de byte impossível), então, na verdade, ativa osorvermodo onde perlatua sobre toda a entrada como um todo.
  • -pe 'code': sedmodo. (eavalia o códigoexpression um registro por vez epri depois).
  • s{...}{...}gse: substitutoglobalmente, trata string comoélinha única ( .também corresponde a caracteres de nova linha), e a substituição deve ser tratada como um perleexpressão paraeavaliar.
  • \K: marçoké o início da peça a ser substituída.
  • (?2): uma maneira de fazer regexp recursiva. Aqui inclui o regexp incluído no segundo (...)grupo. Então \((:(?2)|.)*?\). É (seguido por uma sequência de mais (...)grupos ou outros caracteres (o menor número possível) seguido por ).
  • join(",", $2 =~ /".*?"/g)junta-se à lista de strings que correspondem ".*?"(ou seja, strings entre aspas) $2com uma vírgula.

Responder3

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 estiver, imprima a linha inteira, caso contrário, imprima a primeira palavra seguida por uma vírgula.

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

A saída será:

CREATE TABLE MWWDATA."VTCat02" ("ID","Cat","Style_Code","Vendor_Style_#");

informação relacionada