[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