shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Quebrar arquivo em multiplos


From: Robson Alexandre
Subject: Re: [shell-script] Quebrar arquivo em multiplos
Date: Sun, 20 Nov 2011 17:40:59 -0200

Vou colocar dessa forma que fica mais fácil a visualização usando como
exemplo o INSERT

/INSERT/ {         # Quando encontrar a linha com "INSERT"
    :a ;                # :a = label a
    /;/ ! {              # Senão encontrar a linha com ";" execute
        N ;             # Anexando a próxima linha
        b a             # b (branch) pulando para "a" novamente
    } ;                  #
    s/\n/ /g ;         # Finalizado, substitua todos \n por espaço
    p                   # p (print) mostrando na saída
}

Existe uma ferramenta de debug do sed chamada de sedsed e para parte
que executa N;ba a saída é:
---------Exemplo de entrada-------
INSERT
INTO agenda VALUES(
'Batman',''
,'address@hidden',
'1970-05-15')
;

----------Saída------------
PATT:INSERT INTO agenda $
COMM:/INSERT/ {
COMM::a
COMM:/;/ !{
COMM:N
PATT:INSERT INTO agenda \nVALUES$
COMM:b a
COMM:/;/ !{
COMM:N
PATT:INSERT INTO agenda \nVALUES\n('Super Man',$
COMM:b a
COMM:/;/ !{
COMM:N
PATT:INSERT INTO agenda \nVALUES\n('Super Man',\n'(21)1234-5678 trabalho'$
COMM:b a
COMM:/;/ !{
COMM:N
PATT:INSERT INTO agenda \nVALUES\n('Super Man',\n'(21)1234-5678 trabalho'\n,$
COMM:b a
COMM:/;/ !{
COMM:N
PATT:INSERT INTO agenda \nVALUES\n('Super Man',\n'(21)1234-5678
trabalho'\n,\n'address@hidden'$
COMM:b a
COMM:/;/ !{
COMM:N
PATT:INSERT INTO agenda \nVALUES\n('Super Man',\n'(21)1234-5678
trabalho'\n,\n'address@hidden'\n,'1965-10-25'$
COMM:b a
COMM:/;/ !{
COMM:N
PATT:INSERT INTO agenda \nVALUES\n('Super Man',\n'(21)1234-5678
trabalho'\n,\n'address@hidden'\n,'1965-10-25'\n);$
COMM:b a
COMM:/;/ !{
COMM:p

INSERT INTO agenda
VALUES
('Super Man',
'(21)1234-5678 trabalho'
,
'address@hidden'
,'1965-10-25'
);




Se tivéssemos uma entrada como esta a seguir:

--DROP TABLE [dbo].[TB001]
--GO


INSERT INTO agenda
VALUES
('Super Man',
'(21)1234-5678 trabalho'
,
'address@hidden'
,'1965-10-25'
);

--Criando a tabela [TB001]
CREATE TABLE [dbo].[TB001](
[a] [int] NOT NULL identity,
[b] [varchar](50) NULL,
1 [varchar](50) NULL,
[d] [varchar](50) NULL,
CONSTRAINT [PK_TB001] PRIMARY KEY CLUSTERED
(
[a] ASC
)WITH (PAD_INDEX  = OFF,
STATISTICS_NORECOMPUTE  = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON,
ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

INSERT
INTO agenda VALUES(
'Batman',''
,'address@hidden',
'1970-05-15')
;
INSERT INTO
agenda VALUES
('Robin','(21) 9999-1111',
'address@hidden'
,'1985-12-25');
INSERT
INTO agenda
VALUES('Mulher Maravilha',
'','address@hidden',
''
)
;

e executássemos sed -n "/INSERT/{:a;/;/! {N;ba};s/\n/ /g;p}"
teríamos a saída
INSERT INTO agenda  VALUES ('Super Man', '(21)1234-5678 trabalho' ,
'address@hidden' ,'1965-10-25' );
INSERT  INTO agenda VALUES( 'Batman','' ,'address@hidden', '1970-05-15') ;
INSERT INTO  agenda VALUES ('Robin','(21) 9999-1111',
'address@hidden' ,'1985-12-25');
INSERT  INTO agenda  VALUES('Mulher Maravilha',
'','address@hidden', '' ) ;

Vi que vc se interessa pelo assunto e assim como eu tenta entender
como é o mecanismo do sed em shell-script.
Estas referencias me ajudam bastante no estudo do sed em shell-script:
http://sed.sourceforge.net/
http://thobias.org/doc/sosed.html
http://aurelio.net/sed/

Mais dúvidas estamos aí.
Atenciosamente

Robson Alexandre


Em 17 de novembro de 2011 19:33, eric miranda <address@hidden> escreveu:
> Vlw, Robson.
>
> Eu não pus mais detalhes da dúvida pq estava no trem, lendo no android.
> Entendi que estava pegando tudo que ia de "${cmd}" até ";".
>
> Mas, o que eu realmente não entendi foi
>
> {:a;/;/! {N;ba};
>
> O que é ":a", "!", "{N:ba}"? Pq tem ";/;/" ? =)
>
> Se der pra esclarecer esta parte, eu agradeço.
>
> Eric
>
> Em 17 de novembro de 2011 17:11, Robson Alexandre <address@hidden
>> escreveu:
>
>> **
>>
>>
>> Eric,
>> o for seria pra cada comando SELECT, UPDATE, DELETE, etc,
>> fazer a pesquisa e criar o arquivo .txt separado por comando.
>> o sed -n "/${cmd}/{:a;/;/! {N;ba};s/\n/ /g;p}" arq.txt > "${cmd}.txt"
>>
>> está agrupando tudo entre a linha que contem o comando e a linha que tem o
>> ;
>> p.e. INSERT
>>
>> sed -n "/INSERT/ toda linha que tiver INSERT
>> {:a;/;/! {N;ba}; vai agrupando no hold space até
>> encontrar a linha com o ";"
>> s/\n/ /g;p}" dai substitui todos as quebras \n por espaços
>> arq.txt > "INSERT.txt" e joga apenas o que a gente quer no arquivo.txt
>>
>> caso queira acrescentar/modificar mais/menos consultas do for é só editar o
>> for cmd in INSERT SELECT DELETE UPDATE
>>
>> Acho que me fiz entender, qq dúvida pergunta ai de novo que tento
>> explicar melhor.
>>
>> Atenciosmente
>>
>> Robson Alexandre
>>
>> Em 17 de novembro de 2011 13:45, eric miranda <address@hidden>
>> escreveu:
>> > Robson, dá pra explicar esse sed, por favor?
>> >
>> > Obrigado
>> > Em 17/11/2011 05:53, "Robson Alexandre" <address@hidden>
>> > escreveu:
>> >
>> >> **
>> >>
>> >>
>> >> Marcelo,
>> >>
>> >> tenta isso
>> >>
>> >> for cmd in INSERT SELECT DELETE UPDATE
>> >> do
>> >> sed -n "/${cmd}/{:a;/;/! {N;ba};s/\n/ /g;p}" arq.txt > "${cmd}.txt"
>> >> done
>> >>
>> >> Mas isso não vai resolver a quebra dos nomes dos objetos, pois o sed
>> >> vai pegar tudo entre o comando SELECT, UPDATE, etc e o ; e substituir
>> >> o \n por espaço.
>> >>
>> >> Atenciosamente
>> >>
>> >> Robson Alexandre
>> >>
>> >> Em 16 de novembro de 2011 19:08, Marcelo Loureiro
>> >> <address@hidden> escreveu:
>> >> > Fala Bruno..
>> >> >
>> >> > obrigado pela idéia.
>> >> >
>> >> > Pois é.. o fato de não estar numa única linha era/é um dos meus
>> >> problemas.
>> >> > Pra piorar, as n linhas podem estar quebrando o nome dos objetos do
>> SQL.
>> >> > Por exemplo:
>> >> > INSERT INTO T
>> >> > ABELA VALUES (1)
>> >> > ;
>> >> >
>> >> > Tentei fazer um while simples (sem awk ainda) mas nas linhas em
>> branco, o
>> >> > read me ferrava. (também tem linha em branco no meio do SQL!!)
>> >> > Parti pro awk, while / getline / index.. mas não fui feliz também.
>> >> > Até porque o arquivo de entrada pode não vir (e se pode não vir, com
>> >> > certeza não virá) tão certinho como descrevi.
>> >> > Antes dos comandos pode ter uma numeração (número da linha), pode ter
>> um
>> >> > "." (ponto).. enfim.. não tem bem um padrão.
>> >> >
>> >> > Já estou partindo pra uma outra solução.
>> >> > Vou criar um parser/cleanser numa outra ferramenta.
>> >> > Ele vai cuspir o arquivo no formato que eu preciso pra quebrar os
>> >> arquivos
>> >> > e já sem as n exceções que podem aparecer.
>> >> > Algo como:
>> >> > sql1;linha1;<comando sql>
>> >> > sql1;linha2;<comando sql>
>> >> > sql1;linha3;<comando sql>
>> >> > sql2;linha1;<comando sql>
>> >> > sql3;linha1;<comando sql>
>> >> >
>> >> > Aí sim eu entro com um shell script simples.
>> >> >
>> >> > De qualquer maneira, valeu aí pela ajuda.
>> >> >
>> >> >
>> >> >
>> >> >
>> >> > Em 16 de novembro de 2011 18:52, Bruno Coimbra <address@hidden
>> >> >escreveu:
>> >> >
>> >> >> **
>> >> >>
>> >> >>
>> >> >> 2011/11/16 Marcelo Loureiro <address@hidden>
>> >> >>
>> >> >> > **
>> >> >> >
>> >> >> >
>> >> >> > O arquivo de entrada é um script SQL com multiplos comandos.
>> >> >> >
>> >> >> > Ex:
>> >> >> >
>> >> >> > cat arq.txt
>> >> >> >
>> >> >> > SELECT SYSDATE FROM DUAL;
>> >> >> > CREATE TABLE xxx (campo varchar2(2));
>> >> >> >
>> >> >> > DELETE TAB1 WHERE
>> >> >> > XX=91 ;
>> >> >> >
>> >> >> > INSERT INTO TAB2
>> >> >> > (c1, c2)
>> >> >> > VALUES
>> >> >> > (3,
>> >> >> > 3);
>> >> >> >
>> >> >> > /* comment */
>> >> >> >
>> >> >> > end;
>> >> >> >
>> >> >> > Preciso gerar um arquivo pra cada comando INSERT, DELETE ou UPDATE
>> >> >> > encontrado.
>> >> >> > Alguma sugestão ?
>> >> >> > To tentando usar o getline e index do awk, mas não to conseguindo.
>> >> >> >
>> >> >> com o gawk (GNU awk), tente algo como:
>> >> >>
>> >> >> <code>
>> >> >> BEGIN {
>> >> >> INSERT_FILE="insert.sql";
>> >> >> SELECT_FILE="select.sql";
>> >> >> DELETE_FILE="delete.sql";
>> >> >> }
>> >> >>
>> >> >> $1 == "INSERT" {
>> >> >> print $0 >> INSERT_FILE;
>> >> >> }
>> >> >>
>> >> >> $1 == "SELECT" {
>> >> >> print $0 >> SELECT_FILE;
>> >> >> }
>> >> >>
>> >> >> $1 == "DELETE" {
>> >> >> print $0 >> DELETE_FILE;
>> >> >> }
>> >> >> </code>
>> >> >>
>> >> >> PS.: cada comando SQL precisa estar em uma linha pra que o script
>> acima
>> >> >> funcione.
>> >> >>
>> >> >> Att,
>> >> >> --
>> >> >> Bruno Coimbra
>> >> >> address@hidden
>> >> >>
>> >> >> Existem 11 tipos de pessoas no mundo:
>> >> >> As que entendem binário,
>> >> >> as que acham que entendem
>> >> >> e as que não entendem.
>> >> >>
>> >> >> [As partes desta mensagem que não continham texto foram removidas]
>> >> >>
>> >> >>
>> >> >>
>> >> >
>> >> >
>> >> > [As partes desta mensagem que não continham texto foram removidas]
>> >> >
>> >> >
>> >> >
>> >> > ------------------------------------
>> >> >
>> >> > ----------------------------------------------------------
>> >> > Esta lista não admite a abordagem de outras liguagens de programação,
>> >> como perl, C etc. Quem insistir em não seguir esta regra será moderado
>> sem
>> >> prévio aviso.
>> >> > ----------------------------------------------------------
>> >> > Sair da lista: address@hidden
>> >> > ----------------------------------------------------------
>> >> > Esta lista é moderada de acordo com o previsto em
>> >> http://www.listas-discussao.cjb.net
>> >> > ----------------------------------------------------------
>> >> > Servidor Newsgroup da lista: news.gmane.org
>> >> > Grupo: gmane.org.user-groups.programming.shell.brazil
>> >> >
>> >> > Links do Yahoo! Grupos
>> >> >
>> >> >
>> >> >
>> >>
>> >>
>> >
>> >
>> > [As partes desta mensagem que não continham texto foram removidas]
>> >
>> >
>> >
>> > ------------------------------------
>> >
>> > ----------------------------------------------------------
>> > Esta lista não admite a abordagem de outras liguagens de programação,
>> como perl, C etc. Quem insistir em não seguir esta regra será moderado sem
>> prévio aviso.
>> > ----------------------------------------------------------
>> > Sair da lista: address@hidden
>> > ----------------------------------------------------------
>> > Esta lista é moderada de acordo com o previsto em
>> http://www.listas-discussao.cjb.net
>> > ----------------------------------------------------------
>> > Servidor Newsgroup da lista: news.gmane.org
>> > Grupo: gmane.org.user-groups.programming.shell.brazil
>> >
>> > Links do Yahoo! Grupos
>> >
>> >
>> >
>>
>>
>
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>
>
> ------------------------------------
>
> ---------------------------------------------------------------------
> Esta lista não admite a abordagem de outras liguagens de programação, como 
> perl, C etc. Quem insistir em não seguir esta regra será moderado sem prévio 
> aviso.
> ---------------------------------------------------------------------
> Sair da lista: address@hidden
> ---------------------------------------------------------------------
> Esta lista é moderada de acordo com o previsto em 
> http://www.listas-discussao.cjb.net
> ---------------------------------------------------------------------
> Servidor Newsgroup da lista: news.gmane.org
> Grupo: gmane.org.user-groups.programming.shell.brazil
>
> Links do Yahoo! Grupos
>
>
>


reply via email to

[Prev in Thread] Current Thread [Next in Thread]