Substituição de strings aleatórias [RESOLVIDO]

1. Substituição de strings aleatórias [RESOLVIDO]

Leandro Medeiros
doctorx777

(usa Ubuntu)

Enviado em 20/04/2012 - 22:17h

Olá pessoal,
Sou meio novato no linux, e venho aqui pedir ajuda pq já tentei alguns comandos
mas que não resolveram meu problema.

é o seguinte, tenho um arquivo de texto de clientes para tratar, pois estão com alguns erros.
o problema é mais ou menos assim.

Exemplo do estilo do arquivo:

José Carlos Almeida#Belo Horizonte-Mg@Rua 1 centro;32234589
Antonio Capello#Minas@Rua 2 centro;32234951
Amélia Teixeira#Uberlandia-@Rua 3 centro;35869589

Minha missão é arrumar a parte da cidade, que tem bastante coisa escrito errado e substituir tudo pelo nome do estado, que é "Minas Gerais" e pronto.
A sorte é que esse campo está entre delimitadores fixos que seria o # e o @, e o problema é que nesse campo tem um monte de informação diferente.

O arquivo final ficaria assim:

José Carlos Almeida#Minas Gerais@Rua 1 centro;32234589
Antonio Capello#Minas Gerais@Rua 2 centro;32234951
Amélia Teixeira#Minas Gerais@Rua 3 centro;35869589

Os comandos de iniciante como o cut não me ajudaram muito, e gostaria de resolver isso
em shell script para aprender manipular strings usando o linux.

Alguém sabe como resolver esse problema?

Desde já agradeço.


  


2. Re: Substituição de strings aleatórias [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 20/04/2012 - 22:50h

doctorx777 escreveu:

Olá pessoal,
Exemplo do estilo do arquivo:

José Carlos Almeida#Belo Horizonte-Mg@Rua 1 centro;32234589
Antonio Capello#Minas@Rua 2 centro;32234951
Amélia Teixeira#Uberlandia-@Rua 3 centro;35869589


Após o nome da pessoa sempre vem o caracter # ?


O arquivo final ficaria assim:

José Carlos Almeida#Minas Gerais@Rua 1 centro;32234589
Antonio Capello#Minas Gerais@Rua 2 centro;32234951
Amélia Teixeira#Minas Gerais@Rua 3 centro;35869589


Tenho a impressão que o seu desejo será em parte respondido por este vídeo: http://aurelio.net/blog/2011/04/19/o-jeito-shell-script-de-resolver-problemas/

A saída acho que deverá ser com o comando sed

$ sed 's/\#.*@/#\Minas Gerais@/g'

Não sei se vai resolver para todos, mas com o sed usando esta parte como base, pode ir fazendo ajustes finos.

Qualquer dúvida diga ;)

ps: Usei o exemplo do "José Carlos Almeida#Belo Horizonte-Mg@Rua 1 centro;32234589"
Resulta em: "José Carlos Almeida#Minas Gerais@Rua 1 centro;32234589"





3. UAU!!

Leandro Medeiros
doctorx777

(usa Ubuntu)

Enviado em 20/04/2012 - 23:11h

Caramba AprendiNoLinux, sua solução ficou perfeita!!!!!
obrigado mesmo cara, até fiquei feliz. o bom de tudo é que uma linha tão simples
resolve um problemão.

aqui com meu arquivo simplesmente dei um cat clientesmg.txt | sed 's/\#.*@/#\Minas Gerais@/g' >> clientesmgok.txt
o arquivo resultante saiu perfeito! mais uma vez obrigado. e vou já assistir o vídeo que vc indicou.

Se não for pedir d+, poderia me explicar toda sintaxe do comando? eu não fico feliz apenas com a solução
eu quero entender tudo o q aconteceu, pois com ctz vou me deparar com situações parecidas em breve.
o que eu entendo desse comando é apenas a substituição simples.

se puder dar uma explicação rapida, vai ser de muita utilidade pro meu aprendizado.

já vou marcar como resolvido, e mais uma vez obrigado!


4. Re: Substituição de strings aleatórias [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 20/04/2012 - 23:31h

doctorx777 escreveu:

Caramba AprendiNoLinux, sua solução ficou perfeita!!!!!
obrigado mesmo cara, até fiquei feliz. o bom de tudo é que uma linha tão simples
resolve um problemão.


Isto fica feliz em ser útil rsrs

[/quote]
aqui com meu arquivo simplesmente dei um cat clientesmg.txt | sed 's/\#.*@/#\Minas Gerais@/g' >> clientesmgok.txt
o arquivo resultante saiu perfeito! mais uma vez obrigado. e vou já assistir o vídeo que vc indicou.
[/quote]

Não sei trabalhar sem ouvir músicas ou escutando vídeos de dicas kkkkk


Se não for pedir d+, poderia me explicar toda sintaxe do comando? eu não fico feliz apenas com a solução
eu quero entender tudo o q aconteceu, pois com ctz vou me deparar com situações parecidas em breve.
o que eu entendo desse comando é apenas a substituição simples.

se puder dar uma explicação rapida, vai ser de muita utilidade pro meu aprendizado.

já vou marcar como resolvido, e mais uma vez obrigado!


Bom, o vídeo conta um pouco da história de como e resolver problemas com sed e outros comandos.
Disse que a solução era similar a do vídeo porque o comando faz assim.

sed 's (procurar/substituir) \ (contrabarra para escapar o #), ( ponto . quer dizer tudo) ( * até chegar no @) @ ( / pare aqui e inicie a substituição ) / (colocando o que no lugar do que está sendo substituindo ? ) #\(escapando o # ) Minas Gerais@/ g (geral para todas as linhas) '

Não sei se vai entender desta forma kkkk. Espero que sim. Descontraindo...




Agora o trabalho:








5. Entendido.

Leandro Medeiros
doctorx777

(usa Ubuntu)

Enviado em 21/04/2012 - 00:17h

Certo AprendiNoLinux, compreendi a sintaxe do programa.

só uma ultima ajuda (prometo).
como vc pode perceber esse arquivo tava um lixo, por ele ter sido gerado no windows da
pra saber o motivo.

agora que resolvi o problema da cidade, reparei que tem muiiiiiiiiiiiitos nomes com o primeiro
carectere duplicado. (AFFF)
com certeza é bug do programa que gerou o arquivo.

Usando o mesmo exemplo do nosso amigo José, tem muitas linhas que estão assim:

JJosé Carlos Almeida#Minas Gerais@Rua 1 centro;32234589

bugado, repetiu o J no começo do nome.
eu pensei em dar um simples replace de "JJ" por "J" mas isso pode afetar outros dados, pq o arquivo tem muita informação.
com o replace do J até que não teria problemas, mas com as vogais aí sim...

enfim, pra ficar 100% agora, e pra eu entender de vez pra fazer isso em relatórios futuros (sim, vão continuar usando o programa lixo)
precisaria remover apenas o primeiro byte, caso o primeiro byte e o segundo byte sejam iguais. (so tem duplicados mesmo, já olhei tudo, não tem triplicado).

Acho que agora complica com o sed hein.... enfim, seria

JJosé Carlos Almeida#Minas Gerais@Rua 1 centro;32234589

transformado em

José Carlos Almeida#Minas Gerais@Rua 1 centro;32234589

Bom, é isso.. tomara que possa me ajudar com mais essa, no mais eu me viro aqui.
Valeu ai AprendiNoLinux


6. Re: Substituição de strings aleatórias [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 21/04/2012 - 10:22h

doctorx777 escreveu:

Certo AprendiNoLinux, compreendi a sintaxe do programa.


blz ;)


agora que resolvi o problema da cidade, reparei que tem muiiiiiiiiiiiitos nomes com o primeiro
carectere duplicado. (AFFF)


Ao tratar com ERs o primeiro caractere de um texto é com ^


com certeza é bug do programa que gerou o arquivo.

Usando o mesmo exemplo do nosso amigo José, tem muitas linhas que estão assim:

JJosé Carlos Almeida#Minas Gerais@Rua 1 centro;32234589


Em ER casar o JJ só para o início da linha seria: '^JJ' , já qualquer letra em maiúscula no início é: '^ [A-Z] ' , como precisa ter certeza que a segunda também seja da mesma forma. fica: '^[A-Z]+' (Este + quer dizer que a próxima ocorrência precisa também ser alfabeto e maiúscula; )



Acho que agora complica com o sed hein.... enfim, seria

JJosé Carlos Almeida#Minas Gerais@Rua 1 centro;32234589

transformado em

José Carlos Almeida#Minas Gerais@Rua 1 centro;32234589

Bom, é isso.. tomara que possa me ajudar com mais essa, no mais eu me viro aqui.
Valeu ai AprendiNoLinux


É complicou kkkk. Igual JACK o estripador, por partes....Não aceitou [A-Z]+ então vai uma POG.

Já percebeu que elas começam sempre capitalizadas certo ? [J] [A] , etc... Deve ter outra forma de fazer mais simples, mas consegui assim:
Veja se não vai dar pau em algum lugar rsrs.

sed 's/^[A-Z][A-Z]/.&/ ; s/^\.[A-Z]//'


traduzindo:

^ = Tem que estar no início da linha.
[A-Z] = tem que ser maiúscula.
[A-Z] = Segunda posição tem que ser maiúscula.
/ = terminou o que queremos casar para trocar.
. = Pelo que vou trocar. Pode ser qualquer coisa esquisita. Escolhi o (ponto) para mostrar o ESCAPE na segunda parte.
& = Já vai gravar o .(ponto), então grave novamente o que já casou. JJ, AA, etc...
/ = Fim da substituição.
; = Continue executando o comando sed
s/ = Trocar, ou troque
^ = Só o que começar com....
\. = A contrabarra \ diz ao sed para escapar o (ponto) e usa-lo como literal. Se fossem letras comuns ou números não seria necessário.
[A-Z] = Igual a primeira parte, só para q PRIMEIRA posição se for maiúscula.
/ = troque por nada. Ou seja, vai retirar o .? que tem que ser maiúscula.
/ = Finaliza o comando.

ps: Você me fez aprender mais uma coisa nova. A repetição das maiúsculas kkk. Quebrei a cabeça.


Prova do crime:



ANTES:

JJosé Carlos Almeida#Minas Gerais@Rua 1 centro;32234589 COMO COMO
Maria Carlos Almeida#Minas Gerais@Rua 1 centro;32234589
CCarlos Carlos Almeida#Minas Gerais@Rua 1 centro;32234589
Ana Carlos Almeida#Minas Gerais@Rua 1 centro;32234589
JJosé Carlos Almeida#Minas Gerais@Rua 1 centro;32234589 COMO COMO
Maria Carlos Almeida#Minas Gerais@Rua 1 centro;32234589
CCarlos Carlos Almeida#Minas Gerais@Rua 1 centro;32234589
Ana Carlos Almeida#Minas Gerais@Rua 1 centro;32234589


DEPOIS:


José Carlos Almeida#Minas Gerais@Rua 1 centro;32234589 COMO COMO
Maria Carlos Almeida#Minas Gerais@Rua 1 centro;32234589
Carlos Carlos Almeida#Minas Gerais@Rua 1 centro;32234589
Ana Carlos Almeida#Minas Gerais@Rua 1 centro;32234589
José Carlos Almeida#Minas Gerais@Rua 1 centro;32234589 COMO COMO
Maria Carlos Almeida#Minas Gerais@Rua 1 centro;32234589
Carlos Carlos Almeida#Minas Gerais@Rua 1 centro;32234589
Ana Carlos Almeida#Minas Gerais@Rua 1 centro;32234589




Guarde o link na manga sempre que precisar de alguma ajuda com o comando sed http://thobias.org/doc/sosed.html

Descontração. Agora vou encontrar a minha "bela" kkkk porque senão outro gavião leva.




7. Aee!!

Leandro Medeiros
doctorx777

(usa Ubuntu)

Enviado em 21/04/2012 - 13:53h

AprendiNoLinux, mais uma vez perfeito.

Eu iria demorar um tempo considerável até descobrir que pra
fazer referência ao primeiro caracter tem que se usar o ^

Se tu não me ajuda, eu ia ter que acabar fazendo um programinha em C pra poder resolver, mas
realmente estava bem mais interessado nos comandos shell script, pq uma linha de shell vc consegue
resolver com a mesma eficiência (se não até mais) do que dezenas de linhas de código.

Agora sim, meu arquivo tá prontinho... ajudou pra caramba, tenho que organizar os de clientes de outros
estados, mas agora vai agilizar meu trabalho 100%. valeu mesmo cara.

e só a nível de curiosidade, se o ^ é o curinga pra inicio de linha, qual é o curinga para o fim?

Valeu!


8. Re: Substituição de strings aleatórias [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 22/04/2012 - 21:04h

doctorx777 escreveu:

AprendiNoLinux, mais uma vez perfeito.


Muito bom. Agora se desejar, masque qual foi a melhor resposta para que no futuro a galera que venha pesquisar vá direto ao potno ;)



Agora sim, meu arquivo tá prontinho... ajudou pra caramba, tenho que organizar os de clientes de outros
estados, mas agora vai agilizar meu trabalho 100%. valeu mesmo cara.

e só a nível de curiosidade, se o ^ é o curinga pra inicio de linha, qual é o curinga para o fim?

Valeu!


Teste: Qual você acha que é ?

1) <H ?
2) ^M ?
3) $ ?
4) HM^ ?

kkkkkk










9. eheh

Leandro Medeiros
doctorx777

(usa Ubuntu)

Enviado em 22/04/2012 - 22:22h

Eu li seus links, a resposta é: 3) $ ?.

inclusive já ate consegui fazer mais coisinhas...
só precisava desse empurrãozinho....
mais uma vez obrigado.


10. Re: Substituição de strings aleatórias [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 23/04/2012 - 08:55h

doctorx777 escreveu:

Eu li seus links, a resposta é: 3) $ ?.

inclusive já ate consegui fazer mais coisinhas...
só precisava desse empurrãozinho....
mais uma vez obrigado.


Na mosca :)




11. Probleminhas...

Leandro Medeiros
doctorx777

(usa Ubuntu)

Enviado em 26/04/2012 - 21:48h

Hello Grande AprendiNoLinux!!

Tive um probleminha com a ultima solução de apagar letras repetidas do inicio.
o que acontece é que tem linha que o nome do cliente foi gravado tudo em maiúsculo.

Eis o problema, se as duas primeiras forem maiúsculas, ele apaga a primeira, independente
se elas forem iguais ou não.... vamos ao nosso arquivo.

JJosé Carlos Almeida#Minas Gerais@Rua 1 centro;32234589
ADALBERTO SANTOS#Minas Gerais@Rua 1 centro;32234589
Maria Carlos Almeida#Minas Gerais@Rua 1 centro;32234589
CCarlos Carlos Almeida#Minas Gerais@Rua 1 centro;32234589
JORGE CAMPOS#Minas Gerais@Rua 1 centro;32234589
Ana Carlos Almeida#Minas Gerais@Rua 1 centro;32234589
JJosé Carlos Almeida#Minas Gerais@Rua 1 centro;32234589
RENATO ALVES#Minas Gerais@Rua 1 centro;32234589
Maria Carlos Almeida#Minas Gerais@Rua 1 centro;32234589
CCarlos Carlos Almeida#Minas Gerais@Rua 1 centro;32234589
Ana Carlos Almeida#Minas Gerais@Rua 1 centro;32234589

após aplicar sua solução: sed 's/^[A-Z][A-Z]/.&/ ; s/^\.[A-Z]//'

A saída fica:

JJosé Carlos Almeida#Minas Gerais@Rua 1 centro;32234589
DALBERTO SANTOS#Minas Gerais@Rua 1 centro;32234589
Maria Carlos Almeida#Minas Gerais@Rua 1 centro;32234589
CCarlos Carlos Almeida#Minas Gerais@Rua 1 centro;32234589
ORGE CAMPOS#Minas Gerais@Rua 1 centro;32234589
Ana Carlos Almeida#Minas Gerais@Rua 1 centro;32234589
JJosé Carlos Almeida#Minas Gerais@Rua 1 centro;32234589
ENATO ALVES#Minas Gerais@Rua 1 centro;32234589
Maria Carlos Almeida#Minas Gerais@Rua 1 centro;32234589
CCarlos Carlos Almeida#Minas Gerais@Rua 1 centro;32234589
Ana Carlos Almeida#Minas Gerais@Rua 1 centro;32234589

O coitado dos senhores ADALBERTO, JORGE E RENATO
tiveram a primeira letra do nome cortada. :S

E agora? eu só consigo resolver isso com if's kkkkkk
será que tem como resolver com o sed? se não tiver vou ter que apelar pro C.

valeu cara!



12. Re: Substituição de strings aleatórias [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 26/04/2012 - 21:56h

doctorx777 escreveu:

Hello Grande AprendiNoLinux!!


O coitado dos senhores ADALBERTO, JORGE E RENATO
tiveram a primeira letra do nome cortada. :S


kkkkk


E agora? eu só consigo resolver isso com if's kkkkkk
será que tem como resolver com o sed? se não tiver vou ter que apelar pro C.

valeu cara!


xi..... tentando...



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts