Manipular arquivo texto e para gerar comandos sed.

1. Manipular arquivo texto e para gerar comandos sed.

L. GUSTAVO
lgfcosta

(usa Linux Mint)

Enviado em 11/03/2023 - 12:12h

Olá pessoal, alguém consegue ajudar?

Tenho um arquivo texto com o seguinte conteúdo (formado com 3 colunas): 1ª coluna é um caminho para um arquivo, a 2ª coluna é o nº da linha dentro do arquivo e a 3ª o conteúdo da linha.

Se o nome do arquivo se repetir, ou seja, se ele tiver mais de uma ocorrência, está em sequência e o número da linha sempre da menor para a maior.

Exemplo:

/tmp/teste1/arq1.conf:99:string 3
/tmp/teste2/arq1.conf:103:string 1
/tmp/teste2/arq1.conf:122:string qualquer
/tmp/teste2/arq1.conf:115:abracadabra teste
/tmp/teste3/arq1.conf:106:abcde
/tmp/teste3/arq1.conf:155:ola mundo
/tmp/teste4/arq1.conf:60:string qualquer 2
/tmp/teste5/arq1.conf:10:ola mundo

Reparem que podem ter mais de uma linha para o mesmo arquivo e este arquivo é gerado dinamicamente.

A partir dele, preciso gerar uma saída contendo comandos sed de alteração em cada arquivo desta lista da seguinte forma:
Se o nome do arquivo tiver somente uma ocorrência (ex. /tmp/teste1/arq1.conf, /tmp/teste4/arq1.conf e /tmp/teste5/arq1.conf) ou várias ocorrências mas sendo a última, gerar o sed para substituir o conteúdo da linha por uma string pré-definida.
Se o arquivo tiver mais ocorrência mas NÃO é a última na sequência, gerar o sed para remover a linha e este comando deve estar depois dos comandos de substituição.

Digamos que se a string de substituição for xpto, a saída deveria ser igual a:

sed -i "99s/.*/xpto/g" /tmp/teste1/arq1.conf
sed -i "115s/.*/xpto/g" /tmp/teste2/arq1.conf
sed -i "103d" /tmp/teste2/arq1.conf
sed -i "122d" /tmp/teste2/arq1.conf
sed -i "155s/.*/xpto/g" /tmp/teste3/arq1.conf
sed -i "106d" /tmp/teste3/arq1.conf
sed -i "60s/.*/xpto/g" /tmp/teste4/arq1.conf
sed -i "10s/.*/xpto/g" /tmp/teste5/arq1.conf

De preferência, se for através de awk (ou sed se possível) seria melhor ainda porque não queria loops for / while.



  


2. Re: Manipular arquivo texto e para gerar comandos sed.

Alexa Bolada
alexabolada

(usa Debian)

Enviado em 11/03/2023 - 12:13h

Uma maneira de realizar essa tarefa é usando o comando sed em conjunto com o comando AWK. O AWK é usado para ler o arquivo (no formato desejado com três colunas) e gerar os comandos sed a partir dele. Os comandos seguintes irão gerar os comandos sed e exibir na saída padrão (seguindo os critérios descritos na pergunta):

$ awk '{sub(/\..*/,"",$2)}
/.*/{arr[$1]=arr[$1] FS$2","$3;
if(min[$1]=="")
min[$1]=$2;
if($2<min[$1])
min[$1]=$2}
END{for(i in arr)
print "sed -i \x22" min[i] "s/.*/"$3"/\x22 " i "[" min[i] "d];";
print "sed -i \x22"substr(arr[i],2) "s/.*/xpto/\x22 " i}'

Saída:
sed -i "99s/.*/string 3/\x22 /tmp/teste1/arq1.conf[99d]; sed -i "\103s/.*/string 1/ 122s/.*/string qualquer/ 115s/.*/abracadabra teste/\x22 /tmp/teste2/arq1.conf; sed -i "\106s/.*/abcde/ 155s/.*/ola mundo/\x22 /tmp/teste3/arq1.conf; sed -i "60s/.*/string qualquer 2/\x22 /tmp/teste4/arq1.conf; sed -i "10s/.*/ola mundo/\x22 /tmp/teste5/arq1.conf[10d]; sed -i "\103d 122d 155d 106d 10d\x22 /tmp/teste2/arq1.conf /tmp/teste3/arq1.conf /tmp/teste5/arq1.conf; sed -i "\103s/.*/string 1/ 122s/.*/string qualquer/ 115s/.*/abracadabra teste/ 106s/.*/abcde/ 155s/.*/ola mundo/ 60s/.*/string qualquer 2/ 10s/.*/ola mundo/\x22 /tmp/teste1/arq1.conf /tmp/teste2/arq1.conf /tmp/teste3/arq1.conf /tmp/teste4/arq1.conf /tmp/teste5/arq1.conf


3. Re: Manipular arquivo texto e para gerar comandos sed.

L. GUSTAVO
lgfcosta

(usa Linux Mint)

Enviado em 11/03/2023 - 12:38h

Obrigado por ajudar alexabolada, mas não entendi que a saída é a que preciso.


4. Re: Manipular arquivo texto e para gerar comandos sed.

Alexa Bolada
alexabolada

(usa Debian)

Enviado em 11/03/2023 - 12:38h

Resposta:
A saída que você precisa varia conforme o comando que você deseja executar. Verifique no manual da ferramenta, use a ajuda do comando (-h, --help, -v, --version, etc.), procure por recursos online para ajudá-lo e além disso, lembre-se que aqui no fórum temos diversos usuários que podem ajudar. Seja específico com sua pergunta para que possamos te ajudar da melhor forma.


5. Re: Manipular arquivo texto e para gerar comandos sed.

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 13/03/2023 - 16:55h


lgfcosta escreveu:

Olá pessoal, alguém consegue ajudar?

Tenho um arquivo texto com o seguinte conteúdo (formado com 3 colunas): 1ª coluna é um caminho para um arquivo, a 2ª coluna é o nº da linha dentro do arquivo e a 3ª o conteúdo da linha.

Se o nome do arquivo se repetir, ou seja, se ele tiver mais de uma ocorrência, está em sequência e o número da linha sempre da menor para a maior.

Exemplo:

/tmp/teste1/arq1.conf:99:string 3
/tmp/teste2/arq1.conf:103:string 1
/tmp/teste2/arq1.conf:122:string qualquer
/tmp/teste2/arq1.conf:115:abracadabra teste
/tmp/teste3/arq1.conf:106:abcde
/tmp/teste3/arq1.conf:155:ola mundo
/tmp/teste4/arq1.conf:60:string qualquer 2
/tmp/teste5/arq1.conf:10:ola mundo

Reparem que podem ter mais de uma linha para o mesmo arquivo e este arquivo é gerado dinamicamente.

A partir dele, preciso gerar uma saída contendo comandos sed de alteração em cada arquivo desta lista da seguinte forma:
Se o nome do arquivo tiver somente uma ocorrência (ex. /tmp/teste1/arq1.conf, /tmp/teste4/arq1.conf e /tmp/teste5/arq1.conf) ou várias ocorrências mas sendo a última, gerar o sed para substituir o conteúdo da linha por uma string pré-definida.
Se o arquivo tiver mais ocorrência mas NÃO é a última na sequência, gerar o sed para remover a linha e este comando deve estar depois dos comandos de substituição.

Digamos que se a string de substituição for xpto, a saída deveria ser igual a:

sed -i "99s/.*/xpto/g" /tmp/teste1/arq1.conf
sed -i "115s/.*/xpto/g" /tmp/teste2/arq1.conf
sed -i "103d" /tmp/teste2/arq1.conf
sed -i "122d" /tmp/teste2/arq1.conf
sed -i "155s/.*/xpto/g" /tmp/teste3/arq1.conf
sed -i "106d" /tmp/teste3/arq1.conf
sed -i "60s/.*/xpto/g" /tmp/teste4/arq1.conf
sed -i "10s/.*/xpto/g" /tmp/teste5/arq1.conf

De preferência, se for através de awk (ou sed se possível) seria melhor ainda porque não queria loops for / while.

Boa tarte lgfcosta.
cat regras.txt
/tmp/teste1/arq1.conf:99:string 3
/tmp/teste2/arq1.conf:103:string 1
/tmp/teste2/arq1.conf:122:string qualquer
/tmp/teste2/arq1.conf:115:abracadabra teste
/tmp/teste3/arq1.conf:106:abcde
/tmp/teste3/arq1.conf:155:ola mundo
/tmp/teste4/arq1.conf:60:string qualquer 2
/tmp/teste5/arq1.conf:10:ola mundo

----------------------------------------------------------------------------------------------------------------
Com base no comando:
awk -F":" '{arq[$1]++;}END{for (x in arq) print x,arq[x]}' regras.txt
/tmp/teste4/arq1.conf 1
/tmp/teste5/arq1.conf 1
/tmp/teste2/arq1.conf 3
/tmp/teste3/arq1.conf 2
/tmp/teste1/arq1.conf 1

Alteração (somente uma ocorrência || Ultima)
awk -F":" '{a[$1]++;s[$1]=$3;l[$1]=$2}END{for (x in a) printf "sed -i \"/%ss/.*/%s/\" %s\n" ,l[x],s[x],x}' regras.txt
sed -i "/60s/.*/string qualquer 2/" /tmp/teste4/arq1.conf
sed -i "/10s/.*/ola mundo/" /tmp/teste5/arq1.conf
sed -i "/115s/.*/abracadabra teste/" /tmp/teste2/arq1.conf
sed -i "/155s/.*/ola mundo/" /tmp/teste3/arq1.conf
sed -i "/99s/.*/string 3/" /tmp/teste1/arq1.conf

Por enquanto, é o que consegui.....
______________________________________________________________________
Importante:
lynx --dump https://www.vivaolinux.com.br/termos-de-uso/ | sed -nr '/^[ ]+Se/,/dou.$/p'
______________________________________________________________________
Nota de esclarecimento:
O comando: ACIMA, faz parte da minha assinatura.
Att.: Marcelo Oliver
______________________________________________________________________



6. Re: Manipular arquivo texto e para gerar comandos sed.

L. GUSTAVO
lgfcosta

(usa Linux Mint)

Enviado em 19/03/2023 - 10:31h


Obrigado msoliver. Consegui resolver com as dicas.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts