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
______________________________________________________________________