Pular para o conteúdo

Duvida quase grande [RESOLVIDO]

Responder tópico
  • Denunciar
  • Indicar

1. Duvida quase grande [RESOLVIDO]

Enviado em 20/12/2011 - 06:54h

Bom Dia amigos do forum

Eu tenho um script que já funciona, porem gostaria de poder melhora-lo.

Em uma determinada parte do meu script é criado um .txt com alguns valores, sempre um valor por linha. na sequencia do script eu faço a media desses valores, como a quantidade máxima de valores para a situação em que estou lidando é de 7 números, estou usando o "cat $linha | wc -l" para determinar a quantidade de linhas e assim poder usar o bc para fazer as medias.

o script está assim:

while read linha
do

denominadorM=`cat $linha | wc -l`

if [ $denominadorM = 1 ];then
temp01=$(cat $linha | sed '1!d' | cut -d' ' -f5)
numerador=$temp01
fi

if [ $denominadorM = 2 ];then
temp01=$(cat $linha | sed '1!d' | cut -d' ' -f5)
temp02=$(cat $linha | sed '2!d' | cut -d' ' -f5)
numerador=$(echo "scale=2; $temp01 + $temp02" | bc)
fi

if [ $denominadorM = 3 ];then
temp01=$(cat $linha | sed '1!d' | cut -d' ' -f5)
temp02=$(cat $linha | sed '2!d' | cut -d' ' -f5)
temp03=$(cat $linha | sed '3!d' | cut -d' ' -f5)
numerador=$(echo "scale=2; $temp01 + $temp02 + $temp03" | bc)
fi

.
.
.


como puderam ver funciona, porem tá horrível de feio, e eu tive sorte de só haver no máximo 7 valores.

eu tentei montar um for ou um while mas não consegui ... e supondo q em futuro eu venha a precisar desse tipo de estrutura dentro de um script eu gostaria de saber fazer um laço condicional q resolvesse esse problema

alguém pode me ajudar a montar um laço condicional para isso ao invés de simplesmente repetir o if com uma quantidade maior de comandos ?

Responder tópico

2. Link de referência

Enviado em 20/12/2011 - 10:35h

Oi,

Creio que esse link poderá te ajudar na utilização de laços em shell script. É um resumo básico de sintaxe, mas talvez seja exatamente o que você precisa.

http://www.devin.com.br/shell_script/

Abraços

3. Re: Duvida quase grande [RESOLVIDO]

Enviado em 20/12/2011 - 11:19h

VOcê pode usar arrays em shell VALOR[]


while read linha
do

denominadorM=`cat $linha | wc -l`

for i in $(seq $denominadorM)
do
temp[$i]=$(cat $linha | sed "$i!d" | cut -d' ' -f5)
done # fim do for
numerador=$(echo "scale=2; $(echo ${temp[@]} | tr ' ' '+')" | bc)
....
done # fim do while


Veja se assim ajuda, qualquer coisa posta e posso ajudar assim que possível

4. IFS

Enviado em 20/12/2011 - 13:39h

Se aqueles desvios condicionais foram por conta de espaços nas linhas uma configuração da variável de ambiente IFS pode resolver além de prevenir um possível estouro de memória caso existam muitas parcelas na soma final, tipo umas 1000000 de linhas de entrada. :D


# Versão que reduz perigo de sobrecarga de memória
# caso existam muitas entradas.
# Dica: use man bash e procure por IFS

OIFS=$IFS
IFS=$( echo -e "\n" )
numerador=0;

while read linha
do
numerador=$( echo "escale=2; $( echo $linha | cut -d' ' -f5 ) + $numerador" | bc )
done < 'arq.txt'

IFS=$OIFS

5. ola...

Enviado em 20/12/2011 - 13:58h

Cara... não sei eu saquei direito o seu problema... acho que você não queria ter que criar vários "IFS" no seu código, né?

Acho que com uma função, um while e 1 for pode te ajudar bastante, saca só..



#!/bin/bash
var=""
f1(){
for ((i=0;i<=`cat $1 | wc -l`;i++));do
var=$var"`cat $linha | sed '$i!d' | cut -d' ' -f5` + "
done
var=$var"0"
numerador=`echo \" scale=2; $var | bc \"`
}
while read linha;do
f1 $linha
done < arquivo.txt



Acho que assim fica muito mais sucinto
falowww

6. Re: Duvida quase grande [RESOLVIDO]

Enviado em 20/12/2011 - 18:11h

awk '{ n=n+$5 } END { print n/NR } ' arquivo.txt

8. Re: Duvida quase grande [RESOLVIDO]

Enviado em 21/12/2011 - 10:33h

Muito obrigado a todos.

tenho mesmo q aprender a usar o for, vou ler mais e tentar melhorar.

tbm vou colocar na minha lista de coisas a aprender:

IFS
arrays

Responder tópico

Responder tópico

Entre na sua conta para responder.

Fazer login para responder