Duvida quase grande [RESOLVIDO]

1. Duvida quase grande [RESOLVIDO]

Lincoln Oliveira de Souza
lincolnsol

(usa Fedora)

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 ?


  


2. Link de referência

Vinícius Evandro Gregório
gsi.vinicius

(usa Ubuntu)

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]

Raimundo Alves Portela
rai3mb

(usa Outra)

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

Perfil removido
removido

(usa Nenhuma)

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...

Hudson Moreira Guimaraes dos Santos
hudyfx

(usa Outra)

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]

DAVISON MARCEL PASQUALINI
fdmarp

(usa Debian)

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

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


7. Re: Duvida quase grande [RESOLVIDO]

Guilherme Moreira de Oliveira
milesmaverick

(usa Debian)

Enviado em 20/12/2011 - 22:26h

Você pode consultar aqui: http://vivaolinux.com.br/dica/Tutoriais-de-Shell-Scripts/


8. Re: Duvida quase grande [RESOLVIDO]

Lincoln Oliveira de Souza
lincolnsol

(usa Fedora)

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







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts