Análise e Inserção de valor em linha de arquivo TXT de acordo com valor identificado em coluna espec

1. Análise e Inserção de valor em linha de arquivo TXT de acordo com valor identificado em coluna espec

rogerio aduci martins
rogerioprof

(usa Slackware)

Enviado em 06/10/2022 - 13:46h

Saudações ScriptMasters!!!
Estou com uma demanda para manipular um arquivo de texto e estou tendo dificuldade de criar um script para solucionar a tarefa.
Caso possam ajudar, segue detalhes.
A situação é a seguinte:
Temos um sistema que faz leituras de equipamentos e gera um arquivo TXT com umas 30 linhas, inserindo os valores separados por espaço.

O arquivo tem o conteúdo assim:

20221004 01:00 264.50 211.90 750 674 076 750 0 0 0 2 0
20221004 02:00 264.30 210.50 700 506 080 540 0 0 0 2 0

Segue esse padrão por todo o arquivo, cada linha com data , hora e valores.

O que preciso:
Fazer com que o script leia a sétima coluna (no exemplo, os valores 076 na primeira linha e 080 na segunda),
e caso o valor da sétima coluna seja inferior ao valor de 250, que o script copie o mesmo valor no final de cada linha,ficando como no exemplo assim:

20221004 01:00 264.50 211.90 750 674 076 750 0 0 0 2 0 076
20221004 02:00 264.30 210.50 700 506 080 540 0 0 0 2 0 080


se o valor da sétima coluna for superior a 250, que o script coloque 075 , ficando assim (exemplo alterado):

20221004 01:00 264.50 211.90 750 674 252 750 0 0 0 2 0 075
20221004 02:00 264.30 210.50 700 506 300 540 0 0 0 2 0 075

Pensei em algo tipo IF ELSE usando "sed" , mas confesso que essa manipulação de dados não é o meu forte.

Desde já agradeço seu precioso tempo desprendido na leitura do meu caso e mando os parabéns para essa maravilhosa comunidade.

Um grande abraço!



  


2. MELHOR RESPOSTA

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 06/10/2022 - 16:41h

rogerioprof escreveu:

Saudações ScriptMasters!!!
Estou com uma demanda para manipular um arquivo de texto e estou tendo dificuldade de criar um script para solucionar a tarefa.
Caso possam ajudar, segue detalhes.
A situação é a seguinte:
Temos um sistema que faz leituras de equipamentos e gera um arquivo TXT com umas 30 linhas, inserindo os valores separados por espaço.

O arquivo tem o conteúdo assim:

20221004 01:00 264.50 211.90 750 674 076 750 0 0 0 2 0
20221004 02:00 264.30 210.50 700 506 080 540 0 0 0 2 0

Segue esse padrão por todo o arquivo, cada linha com data , hora e valores.

O que preciso:
Fazer com que o script leia a sétima coluna (no exemplo, os valores 076 na primeira linha e 080 na segunda),
e caso o valor da sétima coluna seja inferior ao valor de 250, que o script copie o mesmo valor no final de cada linha,ficando como no exemplo assim:

20221004 01:00 264.50 211.90 750 674 076 750 0 0 0 2 0 076
20221004 02:00 264.30 210.50 700 506 080 540 0 0 0 2 0 080


se o valor da sétima coluna for superior a 250, que o script coloque 075 , ficando assim (exemplo alterado):

20221004 01:00 264.50 211.90 750 674 252 750 0 0 0 2 0 075
20221004 02:00 264.30 210.50 700 506 300 540 0 0 0 2 0 075

Pensei em algo tipo IF ELSE usando "sed" , mas confesso que essa manipulação de dados não é o meu forte.

Desde já agradeço seu precioso tempo desprendido na leitura do meu caso e mando os parabéns para essa maravilhosa comunidade.

Um grande abraço!

Boa tarde Rogerio.
Exatamente, um condicional.....
Seguem opções:
cat arq.txt
20221004 01:00 264.50 211.90 750 674 076 750 0 0 0 2 0
20221004 02:00 264.30 210.50 700 506 080 540 0 0 0 2 0
20221004 01:00 264.50 211.90 750 674 252 750 0 0 0 2 0
20221004 02:00 264.30 210.50 700 506 300 540 0 0 0 2 0

#------------------------------------------------------------------------------------------------------------#
bash

exec 3< arq.txt #Faz a leitura do arquivo e coloca no descritor 3
while read -a fld -u3;do #Faz a leitura da linha, e gera o array 'fld'
(($((10#${fld[6]}))<250)) && V="${fld[6]}" || V="075" #Teste condicional, gera a var "V"
echo "${fld[@]} $V"
done;
exec 3<&- #Fecha o descritor

20221004 01:00 264.50 211.90 750 674 076 750 0 0 0 2 0 076
20221004 02:00 264.30 210.50 700 506 080 540 0 0 0 2 0 080
20221004 01:00 264.50 211.90 750 674 252 750 0 0 0 2 0 075
20221004 02:00 264.30 210.50 700 506 300 540 0 0 0 2 0 075

#------------------------------------------------------------------------------------------------------------#
awk:
awk -v V="075" '{if($7<250) print $0,$7;else print $0,V}' arq.txt 

#------------------------------------------------------------------------------------------------------------#
A opção "bash", é bem mais rápida...
Obs.: $((10#${fld[6]})) #Faz com que o número seja interpretado como decimal, isso, devido ao 080
É isso...

______________________________________________________________________
Importante:
Se te ajudei, retribua.
Após marcar o tópico como RESOLVIDO, é só escolher a MELHOR RESPOSTA.

______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________


3. Re: Análise e Inserção de valor em linha de arquivo TXT de acordo com valor identificado em coluna espec

rogerio aduci martins
rogerioprof

(usa Slackware)

Enviado em 06/10/2022 - 16:50h


Salve Grande Marcelo!!! Estive até agora lendo vários tópicos desta comunidade "Sed/Awk/ER - Manipulação de Textos/Strings" e vi que vc tem grande atuação. Parabéns! Não poderei testar agora o script , mas amanhã pela manhã cairei em cima para fazer rodar e postarei aqui o resultado para fecharmos o tópico.
Muito obrigado mesmo!!!
Um grande abraço!



4. Re: Análise e Inserção de valor em linha de arquivo TXT de acordo com valor identificado em coluna espec

rogerio aduci martins
rogerioprof

(usa Slackware)

Enviado em 07/10/2022 - 09:08h


msoliver escreveu:

rogerioprof escreveu:

Saudações ScriptMasters!!!
Estou com uma demanda para manipular um arquivo de texto e estou tendo dificuldade de criar um script para solucionar a tarefa.
Caso possam ajudar, segue detalhes.
A situação é a seguinte:
Temos um sistema que faz leituras de equipamentos e gera um arquivo TXT com umas 30 linhas, inserindo os valores separados por espaço.

O arquivo tem o conteúdo assim:

20221004 01:00 264.50 211.90 750 674 076 750 0 0 0 2 0
20221004 02:00 264.30 210.50 700 506 080 540 0 0 0 2 0

Segue esse padrão por todo o arquivo, cada linha com data , hora e valores.

O que preciso:
Fazer com que o script leia a sétima coluna (no exemplo, os valores 076 na primeira linha e 080 na segunda),
e caso o valor da sétima coluna seja inferior ao valor de 250, que o script copie o mesmo valor no final de cada linha,ficando como no exemplo assim:

20221004 01:00 264.50 211.90 750 674 076 750 0 0 0 2 0 076
20221004 02:00 264.30 210.50 700 506 080 540 0 0 0 2 0 080


se o valor da sétima coluna for superior a 250, que o script coloque 075 , ficando assim (exemplo alterado):

20221004 01:00 264.50 211.90 750 674 252 750 0 0 0 2 0 075
20221004 02:00 264.30 210.50 700 506 300 540 0 0 0 2 0 075

Pensei em algo tipo IF ELSE usando "sed" , mas confesso que essa manipulação de dados não é o meu forte.

Desde já agradeço seu precioso tempo desprendido na leitura do meu caso e mando os parabéns para essa maravilhosa comunidade.

Um grande abraço!

Boa tarde Rogerio.
Exatamente, um condicional.....
Seguem opções:
cat arq.txt
20221004 01:00 264.50 211.90 750 674 076 750 0 0 0 2 0
20221004 02:00 264.30 210.50 700 506 080 540 0 0 0 2 0
20221004 01:00 264.50 211.90 750 674 252 750 0 0 0 2 0
20221004 02:00 264.30 210.50 700 506 300 540 0 0 0 2 0

#------------------------------------------------------------------------------------------------------------#
bash

exec 3< arq.txt #Faz a leitura do arquivo e coloca no descritor 3
while read -a fld -u3;do #Faz a leitura da linha, e gera o array 'fld'
(($((10#${fld[6]}))<250)) && V="${fld[6]}" || V="075" #Teste condicional, gera a var "V"
echo "${fld[@]} $V"
done;
exec 3<&- #Fecha o descritor

20221004 01:00 264.50 211.90 750 674 076 750 0 0 0 2 0 076
20221004 02:00 264.30 210.50 700 506 080 540 0 0 0 2 0 080
20221004 01:00 264.50 211.90 750 674 252 750 0 0 0 2 0 075
20221004 02:00 264.30 210.50 700 506 300 540 0 0 0 2 0 075

#------------------------------------------------------------------------------------------------------------#
awk:
awk -v V="075" '{if($7<250) print $0,$7;else print $0,V}' arq.txt 

#------------------------------------------------------------------------------------------------------------#
A opção "bash", é bem mais rápida...
Obs.: $((10#${fld[6]})) #Faz com que o número seja interpretado como decimal, isso, devido ao 080
É isso...

______________________________________________________________________
Importante:
Se te ajudei, retribua.
Após marcar o tópico como RESOLVIDO, é só escolher a MELHOR RESPOSTA.

______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________


Bom dia a Todos.
Marcelo, rodou perfeitamente!!! Tanto o AWK quanto o BASH ficaram com a lógica exata.
Novamente, muito obrigado pela força, a parabéns por sua genialidade!


5. Re: Análise e Inserção de valor em linha de arquivo TXT de acordo com valor identificado em coluna espec

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 07/10/2022 - 13:41h

Boa tarde Rogério.
Agradeço pela melhor resposta e também pelos elogios.


______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts