Script para embaralhar aleatoriamente as linhas de um arquivo
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
Para se manter atualizado sobre as novidades desta coluna, consulte sempre o 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
10 Fev 2010, 22:44
Simples assim!
06 Mai 2008, 09:23
Instalando (Debian e Ubuntu)
aptitude install randomize-lines
Para desordenar:
cat arquivoordenado.txt | rl
16 Mar 2007, 15:36
# 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
01 Fev 2007, 17:32
Continua sem resolver o problema.
26 Jan 2007, 14:42
26 Jan 2007, 14:39
(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
23 Jan 2007, 02:11
echo "$(<entrada.txt)" | sort -R
:)



