Skip to content

Instantly share code, notes, and snippets.

@elder
Created June 24, 2010 13:08
Show Gist options
  • Save elder/451422 to your computer and use it in GitHub Desktop.
Save elder/451422 to your computer and use it in GitHub Desktop.
#!/bin/bash
#
# Este script pega dados gerados pelo programa SAC e monta uma tabela com os seus
# valores, além de realizar o cálculo para a magnitude mR, média e desvio padrão.
#
# Autor: Elder Marco.
# Data: 13/06/2010
#
#--------------------------------------------------------------------------------------
# Verifica se o usuário passou o algum arquivo como argumento
if [ $# -ne 1 ]; then
echo "Você precisa passar um arquivo como argumento."
exit 1
fi
# Expressão regular para apagar coisas inúteis no arquivo obtido
regex="^[[:blank:]]+[[:alnum:]]+[[:blank:]]=[[:blank:]]"
echo -n "Separando valores ... "
for var in KSTNM DIST USER0 ; do
# Pega a linha que contém a variável dada e salva em um
# arquivo temporário removendo o desnecessário.
grep "$var = " $1 > /tmp/sac2tab.$var
sed -r -i "s/$regex//g" /tmp/sac2tab.$var
done
echo "pronto."
echo
# O segundo campo é o valor da distância e está como uma potência de dez.
# Esse valor precisa ser tratado para que a entrada fique de maneira que
# o comando bc possa compreender.
echo "Corrigindo valores ..."
echo "Distâncias corrigidas:"
while read dist; do
# Separa a potência do restante.
distancia=`cut -f 1 -d 'e' <<< $dist`
potencia=`cut -f 2 -d 'e' <<< $dist | tr -d '+'`
# Agora redefine a distância e salva num arquivo separado para
# uso posterior.
distancia2=`bc <<< "scale = 9; $distancia * (10 ^ $potencia)"`
echo -e "\t${distancia}x10^$potencia = ${distancia2} Km"
echo $distancia2 >> /tmp/sac2tab.DIST.corrigido
sed -r -i 's/0+$//g' /tmp/sac2tab.DIST.corrigido
done < /tmp/sac2tab.DIST
echo "pronto."
echo
# O terceiro campo é o valor da amplitude e também está como uma potência
# de dez. Então, é feito da mesma maneira do anterior.
echo "Velocidades corrigidas:"
while read amp; do
# Separa a potência do restante e depois multiplica.
amplitude=`cut -f 1 -d 'e' <<< $amp`
potencia=`cut -f 2 -d 'e' <<< $amp`
# Calcula o valor da velocidade e depois volta para um/s, salvando
# em um arquivo para uso posterior.
velocidade=`bc <<< "scale = 9; $amplitude * (10 ^ 6) * (10 ^ $potencia);"\
| sed 's/^\./0\./g'`
echo -e "\tV = $amplitude x 10^$potencia = ${velocidade} um/s "
echo $velocidade >> /tmp/sac2tab.USER0.corrigido
done < /tmp/sac2tab.USER0
echo "pronto."
echo
# Junta os dois arquivos para calcular o valor de mR. No argumento passado ao comando
# bc abaixo, foi feita uma mudança de base para se trabalhar com o logaritmo na base 10.
paste -d' ' /tmp/sac2tab.USER0.corrigido /tmp/sac2tab.DIST.corrigido > /tmp/sac2tab.data
echo "Calculando magnitude mR ..."
echo "Valores: "
while read vel dist; do
mR=`bc -l <<< "scale = 9; l($vel/2)/l(10) + 2.3 * l($dist) / l(10) - 2.28"`
echo -e "\t$mR"
echo $mR >> /tmp/sac2tab.mR
done < /tmp/sac2tab.data
echo "pronto."
echo
# Agora junta os arquivos de distância e magnitude mR para saber quais dados levar em
# conta no cálculo da média e do desvio padrão.
paste -d' ' /tmp/sac2tab.DIST.corrigido /tmp/sac2tab.mR > /tmp/sac2tab.medstdev
echo "Separando valores de magnitude para o qual 200 < DIST < 1500 ..."
awk '$1 > 200 && $1 < 1500 { print $2 }' /tmp/sac2tab.medstdev > /tmp/sac2tab.medstdev.corrigido
echo "Valores:"
if [ `wc -l /tmp/sac2tab.medstdev.corrigido | cut -d ' ' -f 1` -ne 0 ]; then
for valor in $(cat /tmp/sac2tab.medstdev.corrigido); do
echo -e "\t$valor"
done
else
echo -e "\tnenhum."
fi
echo "pronto."
echo
# Faz os cálculos estatísticos. Se não houver qualquer dado, não será feita
# qualquer análise.
echo "Examinando dados para calcular média e desvio padrão de mR ..."
num_dados=`wc -l /tmp/sac2tab.medstdev.corrigido | cut -f 1 -d ' '`
if [ $num_dados -ne 0 ]; then
soma=`bc <<< "$(cat /tmp/sac2tab.medstdev.corrigido | paste -sd+)"`
media=`bc <<< "scale = 9; $soma/$num_dados"`
stdev=0.0
for termo in $(cat /tmp/sac2tab.medstdev.corrigido); do
stdev="$stdev + ($termo - $media) ^ 2"
done
desvpad=`bc -l <<< "scale = 9; sqrt(($stdev) /($num_dados - 1.0))" | sed 's/^\./0\./'`
echo "Média: $media"
echo "Desvio padrão: $desvpad"
echo
else
echo "Não existem distâncias entre 200 e 1500KM nos dados. Não serão feitos"
echo "cálculos de média e desvio padrão."
echo
fi
echo "Montando tabela ... "
# Certo, agora vamos montar um arquivo base para a tabela, ler ele e depois jogar para
# uma saída formatada mais bonitinha.
paste -d ' ' /tmp/sac2tab.KSTNM /tmp/sac2tab.DIST.corrigido /tmp/sac2tab.USER0.corrigido \
/tmp/sac2tab.mR > /tmp/sac2tab.tabela
# Procura um nome válido tomando cuidado para não sobrescrever os já existentes
i=1
while true; do
[ ! -e "$(pwd)/tabela$i.dat" ] && break
let i++
done
# Esse formato é necessário para que a função printf entenda número com um .
# como separador decimal.
export LC_NUMERIC=en_US.UTF-8
while read estacao dist amp mR; do
printf "%-8s %8.3f %8.4f %8.2f\n" $estacao $dist $amp $mR >> $(pwd)/tabela$i.dat
done < /tmp/sac2tab.tabela
# Agora coloca as informações referentes a média e desvio padrão na última linha, caso
# se aplique.
if [ $num_dados -ne 0 ]; then
printf "%-8c %5c %8c %11.2f(%.2f)\n" X X X $media $desvpad \
>> $(pwd)/tabela$i.dat
fi
echo "Gravou: $(pwd)/tabela$i.dat"
# Apaga todos os arquivos temporários com os dados.
rm -f /tmp/sac2tab.*
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment