Acesso direto ao conteúdo

Busca

Visite também: Segurança Linux ·  UnderLinux ·  VivaOLinux ·  LinuxSecurity ·  NoticiasLinux ·  BR-Linux ·  SoftwareLivre.org ·  [mais]   
 

você está aqui: Home  → Colunistas  →  Cantinho do Shell

 

 

Script para embaralhar aleatoriamente as linhas de um arquivo

Por Júlio Cezar Neves

Data de Publicação: 19 de Janeiro de 2007

O script de hoje ilustra uma forma de se embaralhar, de forma aleatória, as linhas de um arquivo.

1. Criação do Arquivo de teste

  $ seq -f "Numero %g" 10 > entrada.txt    # Criando arq de teste
  $ cat entrada.txt
  Numero 1
  Numero 2
  Numero 3
  Numero 4
  Numero 5
  Numero 6
  Numero 7
  Numero 8
  Numero 9
  Numero 10

2. Criação do Script mix.sh

  # Agora o script
  
  $ cat mix.sh
  #!/bin/sh
  
  # Transforma o IFS em somente <ENTER>
  IFS="
  "
  NumReg=$(cat entrada.txt | wc -l) # Total de Registros
  
  i=0
  # j vai variar de 0 até NumReg-1
  j=$((RANDOM % $NumReg))
  for Reg in $(cat entrada.txt)
  do
  # Enquanto o array de saida (aSai) tiver cheio...
  
      while [ ${aSai[$j]} ]
      do
          j=$((RANDOM % $NumReg))
      done
      aSai[$j]="$Reg"   # Move registro para posição randomica no array done
  > saida.txt           # Cria o arquivo de saida vazio
  
  # Mais um tipo de for :)
  
  for ((i=0; i<=$NumReg-1; i++))
  do
      echo ${aSai[i]} >> saida.txt  # Carrega aleatóriamente o arquivo de saida
  done

3. Execução do script

  $ ./mix.sh
  $ cat saida.txt  # Primeira tentativa
  Numero 8
  Numero 2
  Numero 3
  Numero 1
  Numero 5
  Numero 10
  Numero 7
  Numero 9
  Numero 6
  Numero 4
  $ ./mix.sh
  $ cat saida.txt  # Segunda tentativa
  Numero 5
  Numero 9
  Numero 7
  Numero 8
  Numero 1
  Numero 3
  Numero 2
  Numero 10
  Numero 4
  Numero 6

Um script com esta funcionalidade pode ter várias aplicações. Por exemplo, em um website, se queremos exibir em determinada página uma lista de links, em que desejamos rotacionar os links que aparecem no topo da página, podemos usa-lo para que a ordem seja sempre trocada. O script pode ser acionado via cron, de 10 em 10 minutos, por exemplo.

Veja a relação completa dos artigos da coluna Cantinho do Shell

Formato PDF
Newsfeed RSS
Formato para impressão
PDF RSS Imprimir
  • Currently 2.88/5
  • 1
  • 2
  • 3
  • 4
  • 5

Avaliação: 2.9 /5 (321 votos)


Para se manter atualizado sobre as novidades desta coluna, consulte sempre o newsfeed RSS

Cantinho do Shell NewsFeed RSS

Para saber mais sobre RSS, leia o artigo O Padrão RSS - A luz no fim do túnel.

Opinião dos Leitores

Guilherme
10 Fev 2010, 22:44
shuf entrada.txt > saida.txt

Simples assim!
Fabio Maximo
06 Mai 2008, 09:23
Eu usaria o randomize-lines.

Instalando (Debian e Ubuntu)
aptitude install randomize-lines

Para desordenar:
cat arquivoordenado.txt | rl

Marcio Spelta
16 Mar 2007, 15:36
Tive este problema e resolvi assim no solaris :

# cat nada
1
2
3
4
5
6
7
8
# cat nada | while read a; do echo $RANDOM $a; done | sort -n | awk '{print $2}'
3
6
1
4
7
8
2
5
Paulo
01 Fev 2007, 17:32
Lebon,
Continua sem resolver o problema.
Lebon
26 Jan 2007, 14:42
Utilize o coreutils, ou o bsd-utils e seja independente de shell. :)
Lebon
26 Jan 2007, 14:39
Júlio, tem a opção -R. Confira:

(lebon@homestar) ~ $ qfile -v /usr/bin/sort
sys-apps/coreutils-6.7-r1 (/usr/bin/sort)
(lebon@homestar) ~ $ man sort | grep -- -R
-R, --random-sort
Lebon
23 Jan 2007, 02:11
Eu trocaria o script por isso:
echo "$(<entrada.txt)" | sort -R

:)
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script

Bombando o Shell - Caixa de Ferramentas Gráficas do Shell Linux></A>
</div>
<div align=center>
<!--
<a href='http://www.idph.net/inglesonline/inscricao.shtml' target='_blank'><img src='http://www.dicas-l.com.br/imagens/InglesOnline.jpg' border='0' alt=''></a><BR><BR>-->
<A HREF=http://iol.idph.com.br rel=

 

 

Procure pela casa ou apartamento ideal à venda ou para aluguel na busca inteligente do Imohoo
Buscar imóveis