Subtrair uma valor de uma dada coluna em um arquivo [RESOLVIDO]

1. Subtrair uma valor de uma dada coluna em um arquivo [RESOLVIDO]

Elder Augusto Viana Mota
EAVMota

(usa Ubuntu)

Enviado em 27/08/2020 - 19:51h

Olá pessoal, boa noite!
Estou tentando montar um script em shell que subtraia um valor numérico específico de um intervalo em uma dada coluna de um arquivo. Abaixo a parte do arquivo que contém o intervalo do qual quero subtrair o valor, com os respectivos números de linha:
.
.
.
150 %block AtomicCoordinatesAndAtomicSpecies
151 15.000000000 16.956492057 2.630384818 2
152 15.000000002 28.408305434 3.359099707 2
153 15.000000001 29.511912263 3.358560765 1
154 15.000000000 20.666745588 3.356553781 2
155 14.999999999 19.253581363 3.348683978 2
156 %endblock AtomicCoordinatesAndAtomicSpecies
.
.
.
Quero subtrair o valor 0.55 da coluna 3, entre as linhas 151 e 155.
Eu pensei em usar o "awk" pra definir o intervalo, o "bc" pra realizar a subtração, e o "sed" pra efetuar a substituição, mas não tô conseguindo implementar.

Escrevi o shell assim:
VARa=`awk 'NR>=151 && NR<=154 {print $3}' Strain.fdf`
VARb=`echo "scale=3; ($VARa-0.55)" | bc`
sed -i 's/$VARa/$VARb/g' Strain.fdf

Mas aparece esse erro:
(standard_in) 2: syntax error
(standard_in) 20: syntax error

O qual eu não consegui identificar. Alguém poderia me ajudar em como fazer isso?
Ou que tenha alguma outra sugestão com outros comandos pra realizar essa operação?
Desde já agradeço!!!


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 27/08/2020 - 22:06h

Se você vai usar o awk, por que não faz tudo no awk, que é capaz de fazer todas as operações?


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)

3. Re: Subtrair uma valor de uma dada coluna em um arquivo [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 27/08/2020 - 23:29h


EAVMota escreveu:

Olá pessoal, boa noite!
Estou tentando montar um script em shell que subtraia um valor numérico específico de um intervalo em uma dada coluna de um arquivo. Abaixo a parte do arquivo que contém o intervalo do qual quero subtrair o valor, com os respectivos números de linha:
.
.
.
150 %block AtomicCoordinatesAndAtomicSpecies
151 15.000000000 16.956492057 2.630384818 2
152 15.000000002 28.408305434 3.359099707 2
153 15.000000001 29.511912263 3.358560765 1
154 15.000000000 20.666745588 3.356553781 2
155 14.999999999 19.253581363 3.348683978 2
156 %endblock AtomicCoordinatesAndAtomicSpecies
.
.
.
Quero subtrair o valor 0.55 da coluna 3, entre as linhas 151 e 155.
Eu pensei em usar o "awk" pra definir o intervalo, o "bc" pra realizar a subtração, e o "sed" pra efetuar a substituição, mas não tô conseguindo implementar.

Escrevi o shell assim:
VARa=`awk 'NR>=151 && NR<=154 {print $3}' Strain.fdf`
VARb=`echo "scale=3; ($VARa-0.55)" | bc`
sed -i 's/$VARa/$VARb/g' Strain.fdf

Mas aparece esse erro:
(standard_in) 2: syntax error
(standard_in) 20: syntax error

O qual eu não consegui identificar. Alguém poderia me ajudar em como fazer isso?
Ou que tenha alguma outra sugestão com outros comandos pra realizar essa operação?
Desde já agradeço!!!

Boa noite,
Como já foi "dito", o awk faz todo o trabalho.....
Com base no exemplo postado,
"Peguei" da linha 2 a 5, e fiz a subtração.....
awk 'NR>=2 && NR<=5 {printf "%s %s %.9f %s\n" ,$1,$2,($3-0.55),$4}' texto
15.000000000 16.956492057 2.080384818 2
15.000000002 28.408305434 2.809099707 2
15.000000001 29.511912263 2.808560765 1
15.000000000 20.666745588 2.806553781 2

Obs.: Usando o "gawk" é possível gravar a alteração no arquivo,
a ainda, gerar um ".backup" do original....
gawk -i inplace -v INPLACE_SUFFIX=.backup '{if(NR>=151 && NR<=155) printf "%s %s %.9f %s\n" ,$1,$2,($3-0.55),$4;else print $0}' texto 

É isso....
Tudo com um único comando......
Casa da linha 151 a 155, subtrai 0.55 do campo 3, e as demais linhas não faz alterações.....
______________________________________________________________________
Importante: echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')\n"
Att.: Marcelo Oliver
______________________________________________________________________






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts