Peczenyj's Blog

Just Another /Perl|Ruby|C++|Java|Python|JavaScript|Flash|Bash/ Hacker

Calculando Números Primos Usando Shell

Será possivel determinar se um número é primo, ou não, usando o bom e velho shell?

A resposta está no comando factor

seq 1 250 | factor | awk -F \: '$1 == $2{ print $1}' | column -x
2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97 101 103 107 109 113
127 131 137 139 149 151 157 163 167 173
179 181 191 193 197 199 211 223 227 229
233 239 241


A ideia é simples: se um número é primo ele possui apenas um único fator – ele mesmo. Basta detectar esses casos via awk (ou grep, sed, existem varias formas). Usei aqui o seq para gerar uma seqüência e o column para tabular os resultados.

Identificando Linhas Repetidas Em Varios Arquivos

Vamos imaginar dois arquivos bem simples e tres formas de identificar as linhas que aparecem em ambos:

$ cat arq1
oi
awk
ciencia
oi zoi

$ cat arq2
luxo
awk
oi
luxo


Simples de perceber que as linhas ‘oi’ e ‘awk’ se repetem. Poderiamos pensar em uma poderosa união de sort + uniq
$ sort <(sort arq1 | uniq) <(sort arq2 | uniq) | uniq -d
awk
oi


Ou podemos abordar arrays em AWK (elegante, não?)
$ awk 'NR==1{ base=FILENAME } 
base == FILENAME {linhas[$0]++}
base != FILENAME && linhas[$0] { print }' arq1 arq2
awk
oi


Ou podemos usar o bom e velho grep:
$ grep -xf arq1 arq2
awk
oi

Qual a melhor abordagem? Ai depende de cada um :)

Veja toda a aula que deu origem à estes scritps aqui.

Comments

Tiago Peczenyj
Denis, mantive os seus dois comentarios, apesar de serem semelhantes.

Saca só, se pensarmos em 16 milhões de linhas, temos q pensar exatamente no que queremos. se for para encontrar as linhas exatas, talvez o grep seja mais rápido, porém acredito que vai ter muito acesso a disco.

Se separarmos os arquivos em partes, de acordo com os caracteres iniciais, acho que a pesquisa pode ficar bem mais rapida – se estiverem ordenados então vai q é um tapa.

Ou talvez seja o momento de pensar em algoritmos mais complexos :)
Denis
Imagino que para um busca menor de 16milhoes a melhor seria o grep, pois nao utiliza os redirects como no caso do UNIQ.
Denis
Imagino que para um busca menor de 16milhoes a melhor seria o grep, pois nao utiliza os redirects como no caso do SORT. Se nao o AWK.

As Origens Do Caos Aereo Brasileiro

O dia 17 de julho será lembrando, infelizmente, como a data do pior desastre aéreo em território Brasileiro. Todos os meios de comunicação enviam maciçamente informações, fotos e, sobretudo, opiniões de especialistas sobre o assunto. Não há como não se envolver – principalmente no Rio Grande do Sul, o estado de origem da maioria dos passageiros.

As opiniões se dividem: terá sido erro do piloto (que não está aqui para se defender), a pista estava com problemas ou terá sido um acidente inevitável?

Independente da resposta, a explicação do inegável Caos Aéreo Brasileiro não está em uma Caixa-Preta, ou em Tapes de Conversa de pilotos com a torre, não foi culpa dos Controladores de Vôo muito menos do Clima. Engana-se quem acha que tudo começou com o acidente da Gol.

A resposta vem em uma apresentação do presidente da Andep (Associação Defesa dos Direitos dos Passageiros do Transporte Aéreo) Cláudio Candiota Filho, na CPI do Apagão Aéreo. Especialista no ramo que, humildemente, cedeu uma cópia para que todos possam ver o inegável desmantelamento do setor aéreo e a fome de cargos corrupta que aniquilou o sistema de aviação civil brasileiro.



Link direto para a apresentação: aqui.

Minhas condolências a todos que perderam um ente querido ou sofreram com este terrível acidente.

Comments

Tiago Peczenyj
Opa, Valeu! Tche, andei fazendo umas pesquisas estes dias, vem coisa nova aí em breve.
NetWalker
Saudações Peczenyj.
Descobri teu blog há alguns posts atrás. E já chamou-me a atenção pela qualidade dos posts, sobretudo pelas citações de Rogue e The Last Star Fighter (old memories :), bem como demais “assuntos computacionais”.
Não detectei a freqüência com que o atualiza, mas fica aqui um pedido de um leitor assíduo que já até realizou um fork de seu youtube downloader: continue a postar. :)
Espero que não tenha perdido algúem próximo, nesse terrível descaso “Brazileiro”. Sobre o qual a “vergonha cidadã” impede-me de tecer maiores comentários.
No mais, fica meus agradecimentos pelas contribuições em conhecimento e pelo youtube downloader.
[]s (NetWalker)

Baixando Musicas Do iJigg

O iJigg é um youtube de mp3, basicamente. É interessante para trocar músicas ou mesmo colocar um pequeno player no seu site, como este:


Escolhi a musica Surfista Calhorda, dos Replicantes. Conheci este site graças a esta dica do dicas-l.

Como todo bom nerd, decidi melhorar a dica, provendo um script para isso.

#!/bin/bash
[ -z "${1}" ] && { echo "usage: $0 < ijigg URL | ID >" ; exit 1 ; }
ID=${1##*/}
CMD='/Location\|Title/{s/<[^>]\+>//g;p}'
URL="http://www.ijigg.com/cgi-bin/loadSongData.cgi?songID=${ID}"

set - $( wget -q -O - "${URL}" | sed -n "${CMD}" | tr '\n ' '\t_' )

wget ${1} -O "${2%.mp3}.mp3"


Ao executar e passar a URL ou ID da música como argumento, eu faço uma busca no site atras de informações sobre a mesma (veja variavel URL). Esta consulta é um xml que retorna a localização do arquivo mp3 e do seu nome. Faço uns malabarismos com SED – que nem são tão complicados assim – e obtenho a url direta para baixar o arquivo e o seu nome em um bom formato (troco os espaços do nome por ‘_’ – para permanecer os espaços no nome tem q fazer mais uns malabarismos…).

Nesse caso:
$ ./ijigg.sh http://www.ijigg.com/songs/V2DA7ADPD
--15:10:05-- http://staticmdb-001.ijigg.com/songdata04/...
=> `Replicantes_-_Surfista_calhorda.mp3'
...
15:10:55 (33.26 KB/s) - `Replicantes_-_Surfista_calhorda.mp3' saved

Agora basta ouvir no seu player preferido.