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 TABLE
no 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 ondeperl
atua sobre toda a entrada como um todo.-pe 'code'
:sed
modo. (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)$2
com 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_#");