shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Pegar valores em posição determinada e calcular média


From: Tiago Barcellos Peczenyj
Subject: Re: [shell-script] Pegar valores em posição determinada e calcular média
Date: Thu, 4 May 2006 16:08:58 -0300

ufa...

One liner (muito dificil, queria ter usado o dc para isso, calcular a
media em pilha mas não sei fazer isso em notação polonesa reversa, se
alguem quiser sera bem vindo)

cut -c250-255 arquivo.txt | egrep -n '[0-9]*' | tac | tr '\n' ' ' |
sed 's/[0-9]*/\/&/;s/:/\n/;s/[0-9]*://g' | tac | tr s ' ' | tr ' ' '+'
| sed 's/+/(/;s/+\//)\//' | bc -l

157 caracteres e 8 pipes ...2 seds, 2 tacs e 3 trs... o_O

para ver a evolução da coisa, basta pegar o exemplo

# lista de valores
$ cut -c6-8 txt
1
2
3
4
5
10
1

# usando o egrep encontramos o numero da ultima linha
# que eh o nosso numero de elementos // importante pra media
$ cut -c6-8 txt | egrep -n '[0-9]*'
1: 1
2: 2
3: 3
4: 4
5: 5
6: 10
7: 1

# invertemos a lista
# Olha ai o nosso 7 em primeiro lugar
$ cut -c6-8 txt | egrep -n '[0-9]*' | tac
7: 1
6: 10
5: 5
4: 4
3: 3
2: 2
1: 1

# agora eu deito tudo numa linha
$ cut -c6-8 txt | egrep -n '[0-9]*' | tac | tr '\n' ' '
7: 1 6: 10 5: 5 4: 4 3: 3 2: 2 1: 1

# bom eu preciso manter o 7 e remover os outros numeros acompanhados de :
# que são numeros de linha irrelevantes
# vou aproveitar e colocar um / na frente do 7 -- sera util no futuro
$ cut -c6-8 txt | egrep -n '[0-9]*' | tac | tr '\n' ' ' | sed 's/[0-9]*/\/&/;s/
:/\n/;s/[0-9]*://g'
/7
1  10  5  4  3  2  1

# humm o bom e velho tac deixa em uma forma conhecida...
$ cut -c6-8 txt | egrep -n '[0-9]*' | tac | tr '\n' ' ' | sed 's/[0-9]*/\/&/;s/
:/\n/;s/[0-9]*://g' | tac
1  10  5  4  3  2  1 /7

# removemos uns espacos a mais...
$ cut -c6-8 txt | egrep -n '[0-9]*' | tac | tr '\n' ' ' | sed 's/[0-9]*/\/&/;s/
:/\n/;s/[0-9]*://g' | tac | tr -s ' '
1 10 5 4 3 2 1 /7

# so falta colocar os parentesis!
$ cut -c6-8 txt | egrep -n '[0-9]*' | tac | tr '\n' ' ' | sed 's/[0-9]*/\/&/;s/
:/\n/;s/[0-9]*://g' | tac | tr -s ' ' | sed 's/ /(/;s/ \//)\//;s/ /+/g'
(1+10+5+4+3+2+1)/7

# media calculada pelo bc
$ cut -c6-8 txt | egrep -n '[0-9]*' | tac | tr '\n' ' ' | sed 's/[0-9]*/\/&/;s/
:/\n/;s/[0-9]*://g' | tac | tr -s ' ' | sed 's/ /(/;s/ \//)\//;s/ /+/g' | bc -l

3.71428571428571428571

# comparando com a versão em AWK
$ cut -c6-8 txt | awk '{A += $0} END {print A/NR}'
3.71429

# legal... :)

On 5/4/06, Julio Cezar Neves - DATAPREVRJ
<address@hidden> wrote:
Quase one liner...

Soma=$(cut -c250-255 arqlista.txt | paste -sd+ | bc)
# a Contagem de registros é que atrapalha o one liner:
QtdReg=$(wc -l arqlista.txt | tr -s ' ' | cut -f2 -d' ')
echo $((Soma / QtdReg))

Se quiser fazer tudo junto:
echo $(($(cut -c250-255 arqlista.txt | paste -sd+ | bc) / $(wc -l
arqlista.txt | tr -s ' ' | cut -f2 -d' ')))

[ ]s,
Julio (http://www.julioneves.com)
Lido em um site Português: "O Windows tem um problema de design, é como umas
calças com a breguilha na parte de trás, por muitos cintos que metam nunca
ficam seguras."
--
Tiago B Peczenyj
Linux User #405772

# cd /pub
# more beer


reply via email to

[Prev in Thread] Current Thread [Next in Thread]