AWK - Substituição de Strings em CAMPO CERTO

1. AWK - Substituição de Strings em CAMPO CERTO

Vinícius Vilas Boas
vboas

(usa Red Hat)

Enviado em 14/10/2015 - 14:31h

Olá Linuxers (&& programmers), tudo bem?
Espero que sim.

Sou novo em programação AWK, e acreditem, eu já procurei por N exemplos de como utilizar as funções sub, gsub, e gensub no AWK, porém, sem sucesso. Por isso, estou recorrendo ao fórum, espero que possam me ajudar. :)

Tenho um arquivo de texto (files.txt) que possui MILHÕES de registros, com o conteúdo semelhante ao descrito abaixo:

/storage1;read;./conta1.txt
/novostorage2;read;./conta1.txt.bkp


O caminho absoluto do arquivo "conta1.txt" é em "/storage1/conta1.txt", o caminho absoluto do arquivo "conta1.txt.bkp" é o "/novostorage2/conta1.txt.bkp". Utilizando o AWK, eu preciso pegar o caminho absoluto dos arquivos, então eu fiz o seguinte:

$ awk -F";" '{ print $1 $3}' files.txt 


Ele me retornou o seguinte conteúdo:

/storage1./conta1.txt 
/novostorage2./conta1.txt.bkp


Observem, que ele me trouxe o ".", e para o que eu preciso (processar milhões de registros por outro script), eu não posso ter este ponto.

Então, tentei uma concatenção com o AWK, fazendo o seguinte:

awk -F";" '{ print $1 $3}' files.txt | awk -F"." '{ print $1 $2 $3}' 


Mas o problema mora justamente ai, se eu utilizar o "." como delimitador, eu não sei quantos pontos poderá ter um determinado registro, logo eu não posso especificar com precisão quais serão os campos que devem ser printados como resultado. Logo então, eu fui atrás do sub, gsub ou gensub. Porém, fica ai grande dificuldade dessa lógica de programação.

Dada o resultado:

/storage1./conta1.txt 
/novostorage2./conta1.txt.bkp


Pegar tudo o que for "x" e substituir por "y", ok - isso eu consegui fazer. A dúvida é:

Como pegar apenas o PRIMEIRO "." (ponto) que antecede a "/" (barra) e suprimi-lo? (fazê-lo desaparecer) Sem alterar os "." (pontos) subsequentes dos nomes dos arquivos?

PS: Se tiverem outra maneira de fazer sem ser por AWK, esta valendo também. ;)

Se puderem me ajudar, ficarei muito, mas muito grato!

Obrigado desde já!




  


2. Re: AWK - Substituição de Strings em CAMPO CERTO

thinomar
thinomar

(usa Linux Mint)

Enviado em 14/10/2015 - 15:56h

awk -F";" '{print $1 $3}' ./files.txt | sed "s/\.\//\//g" 

Assim o sed substitui tudo que for "./" por apenas "/"
--
-I've been talking to the main computer
-And...?
-It hates me


3. Agradecimento; Mas e como o AWK, como seria?

Vinícius Vilas Boas
vboas

(usa Red Hat)

Enviado em 14/10/2015 - 17:53h

Olá amigo! Funcionou, obrigado!

Mas eu fui processar o arquivo, e como tenho milhões de registros, a demora foi grande.

Será que teríamos um desempenho melhor se fosse feito o processamento com o AWK?

Como fazer isso com o AWK (sub, gsub ou gensub)?


4. Re: AWK - Substituição de Strings em CAMPO CERTO

Vinícius Vilas Boas
vboas

(usa Red Hat)

Enviado em 14/10/2015 - 17:59h

$ awk -F";" '{ print $1 $3 }' files.txt | awk 'gsub("./","/")'
/roo/scripts_la/awk/arquivo1.txt
/roo/scripts_la/awk/arquivo2.txt
/roo/scripts_la/awk/arquivo3.txt
/roo/scripts_la/aw/newfiles/arquivo1.txt
/roo/scripts_la/aw/newfiles/arquivo2.txt
/roo/scripts_la/aw/newfiles/arquivo3.txt


Seguindo a lógica do comando sed eu usei a função gsub do awk. Contudo, notem que ele está suprimindo o 1º caractere antes da barra (/).






5. Re: AWK - Substituição de Strings em CAMPO CERTO

thinomar
thinomar

(usa Linux Mint)

Enviado em 16/10/2015 - 16:27h

Eae vboas? Tinha esquecido de você, cara. Desculpe pela demora na resposta.

Então, se não dá pra usar o sed por causa da demora no processamento, então não adianta usar outro awk, por que vai continuar com o mesmo problema, que é redirecionar saída para outra ferramenta. Então segue abaixo o comando com o gsub:
awk -F";" '{gsub(/\.\//,"/"); print $1 $3}' ./files.txt 


Obs: O caracter estava sendo suprimido por que "." é um caracter reservado, então é necessário dar um escape com "\" antes do caracter.
--
-I've been talking to the main computer
-And...?
-It hates me






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts