Ajuda script shell/awk [RESOLVIDO]

1. Ajuda script shell/awk [RESOLVIDO]

Ramiro
ramiro99

(usa Linux Mint)

Enviado em 30/11/2012 - 15:30h

Fala galera...

estou precisando de uma mãozinha num script que estou fazendo aqui, pode ser feito tanto em awk/bash, o problema é o seguinte: tenho um arquivo txt com 4 colunas e "N" linhas, e preciso gerar outro arquivo com as seguintes informações:

-> Na 1ª coluna colocar: os números que aparecem na segunda coluna do primeiro arquivo txt
-> Na 2º coluna colocar: a quantidade de vezes que os números apareceram
-> Na 3ª coluna colocar: a divisão da quantidade de vezes que o número apareceu pela quantidade de linhas do primeiro arquivo
-> Na 4º coluna colocar: média cumulativa das divisões...como assim? segue abaixo um exemplo


Segue um exemplo para melhor exemplificação:

Arquivo de entrada:

http://img145.imageshack.us/img145/9964/arqentrada.png


Arquivo que deverá ser gerado:

http://img40.imageshack.us/img40/1690/arqsaida.png


Aew galera, sei que é um pouco complicado, porém qualquer ajuda que vcs puderam me dar aqui serei grato...
Abrass


  


2. Re: Ajuda script shell/awk [RESOLVIDO]

Ricardo Lino Olonca
ricardoolonca

(usa Debian)

Enviado em 30/11/2012 - 17:51h

Não consegui abrir os links.


3. Re: Ajuda script shell/awk [RESOLVIDO]

Ramiro
ramiro99

(usa Linux Mint)

Enviado em 01/12/2012 - 00:35h

maionesebr escreveu:

Não consegui abrir os links.


Como assim? Aparece página inválida ou algo do tipo?


4. Re: Ajuda script shell/awk [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 01/12/2012 - 01:03h

Você já tentou fazer? Tente primeiro, e traga suas eventuais dúvidas.


5. Re: Ajuda script shell/awk [RESOLVIDO]

Ramiro
ramiro99

(usa Linux Mint)

Enviado em 01/12/2012 - 09:45h

Bom, primeiro estou tentando imprimir os números e a quantidade de ocorrências na frente...

awk -F"\t" '{
if ($2==0) {

}
else {
num=$2;
prox+=(NR==5 print $2);
if(num==prox)
ocorrencia++;

print num prox >> "teste.dat";
qtdLinhas++;
}

} END{ print "\nFIM DO ARQUIVO" }' "$nomeArquivo" >> "teste.dat"

;;


6. Re: Ajuda script shell/awk [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 01/12/2012 - 21:28h

Leia, na documentação do awk, a parte de arrays associativos. Você provavelmente vai querer usá-los.


7. Re: Ajuda script shell/awk [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 02/12/2012 - 00:50h

Aliás, as versões mais novas do bash têm também arrays associativos. Se você preferir muito usar o bash, poderia começar o esqueleto do seu programa com ele.

Contudo, eu recomendo usar mesmo o awk, pois o bash só faz contas com números inteiros, e você terá de usar números racionais para obter os dados da terceira e quarta colunas. Não é impossível obter tais valores por meio de programas externos (por exemplo: com o bc ou dc, ou mesmo o próprio awk), mas seria muito menos eficiente do que usar uma ferramenta que já possua o recurso.

Se você quiser muito usar shell, e tal shell não tiver de ser obrigatoriamente o bash, pode experimentar usar ksh (versão 93) ou o zsh, que têm suporte tanto a arrays associativos quanto a aritmética de ponto-flutuante.

Eu, porém, usaria Perl ou Python para esse tipo de script.


8. Re: Ajuda script shell/awk [RESOLVIDO]

euteste da silva
foxbit3r

(usa Solaris)

Enviado em 02/12/2012 - 12:54h

Olha se te ajuda.
Você vai precisar criar um arquivo:
exemplo.awk
No arquivo vc pode colocar o seguinte código

#!/bin/awk -f
{
arr[$2]++
}
END {
tempfile="/tmp/tmpXX"
ordenar="sort -n > " tempfile
for(i in arr) {
print i, arr[i] | ordenar
}
close(ordenar)
divSum=div=0
while((getline linha < tempfile)>0){
split(linha,vArr," ")
div=vArr[2]/NR
divSum+=div
saida=sprintf("%d\t%d\t%.3f\t%.3f",vArr[1],vArr[2],div,divSum)
print saida > "saida.out"
}
close(tempfile)
system("rm -f " tempfile)
}


vc deve chamar assim o programa;

$ awk -f exemplo.awk dados.txt
O programa irá gerar um saida.out que tem o que vc precisa.

$ cat saida.out

Isso daí q vc tá fazendo server para o q?
Aproveite e faça uns ajustes como remoção de linhas em branco no programa e colocar um cabeçalho nas colunas.




9. Re: Ajuda script shell/awk [RESOLVIDO]

Ramiro
ramiro99

(usa Linux Mint)

Enviado em 02/12/2012 - 19:18h

foxbit3r escreveu:

Olha se te ajuda.
Você vai precisar criar um arquivo:
exemplo.awk
No arquivo vc pode colocar o seguinte código

#!/bin/awk -f
{
arr[$2]++
}
END {
tempfile="/tmp/tmpXX"
ordenar="sort -n > " tempfile
for(i in arr) {
print i, arr[i] | ordenar
}
close(ordenar)
divSum=div=0
while((getline linha < tempfile)>0){
split(linha,vArr," ")
div=vArr[2]/NR
divSum+=div
saida=sprintf("%d\t%d\t%.3f\t%.3f",vArr[1],vArr[2],div,divSum)
print saida > "saida.out"
}
close(tempfile)
system("rm -f " tempfile)
}


vc deve chamar assim o programa;

$ awk -f exemplo.awk dados.txt
O programa irá gerar um saida.out que tem o que vc precisa.

$ cat saida.out

Isso daí q vc tá fazendo server para o q?
Aproveite e faça uns ajustes como remoção de linhas em branco no programa e colocar um cabeçalho nas colunas.



Problema resolvido! \o/
Muito obrigado foxbit3r, fiz umas adaptações e ficou mto bacana...e vc me perguntou para que serve o script né?! Ele serve para extrair dados de arquivos de logs que estão sendo gerados, estou automatizando umas paradas aqui...

Só mais uma pergunta: tem como eu concatenar alguma coisa em uma coluna específica? Por ex: quero concatenar uma coluna inteira de números na 5ª quinta coluna num arquivo que já contém 4 colunas de informação



10. Re: Ajuda script shell/awk [RESOLVIDO]

euteste da silva
foxbit3r

(usa Solaris)

Enviado em 02/12/2012 - 22:48h

eu acho que sim.


11. Re: Ajuda script shell/awk [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 02/12/2012 - 23:38h

Eu particularmente não gosto desse negócio de resolver o problema para o outro. Acho que o objetivo do fórum não é o de dar peixe, mas o de ensinar a pescar.

Para acrescentar mais uma coluna em linhas de dados já existentes num arquivo, pesquise sobre o comando paste. Também funciona usar sed -i ou perl -i. Ainda, pode-se usar o próprio awk, dependendo de o que se queira fazer.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts