- Creando el mazo de cartas. Creo un arreglo con tantas posiciones como líneas tiene el archivo de entrada (el de N líneas).
- Barajando el mazo de cartas. Cojo el primer y último elemento del arreglo origen (source) y los coloco de últimos en el arreglo destino (tmp). Esto lo hago hasta vaciar el arreglo de origen y repito el procedimiento un número "aleatorio" de veces, entre 20 y 120 veces en este ejemplo. Siempre reemplazando al final de cada bucle el arreglo de origen por el temporal.
- Intercambiando última y primera carta. Esto para garantizar que la primera carta no permanezca siempre igual
- Sacando M cartas del mazo. Cojo las primeras M cartas del mazo.
#!/bin/bash # Variables fileName=$1 inputLines=`wc -l $fileName | cut -d' ' -f1` outputLines=$2 # 596 # Filling array for i in `seq 0 $((inputLines-1))`; do source[$i]=$((i+1)) done # Shuffling array ceil=$((RANDOM%10*10+20)) # from 20 to 120, increment 10 for rand in `seq 1 $ceil`; do tmpIndex=0 for srcIndex in `seq 0 $(($inputLines/2))`; do let srcTopIndex=$inputLines-$srcIndex tmp[$tmpIndex]=${source[$srcIndex]} tmp[$((tmpIndex+1))]=${source[$srcTopIndex]} let tmpIndex+=2 done # for arrays with odd length if [ $(($inputLines%2)) -eq 1 ]; then tmp[$tmpIndex]=${source[$((srcIndex+1))]} fi source=( ${tmp[@]} ) # copying tmp array done # Changing first element for last one tmp=source[0] source[0]=${source[$((inputLines-1))]} source[$((inputLines-1))]=$tmp # Printing random lines of input file for i in `seq 0 $(($outputLines-1))`; do sed -n "${source[$i]}p" $fileName done
Cosas interesantes en este ejemplo:
- Manejo de arreglos: ver iteraciones, copia, extracción y asignación de valores.
- Extracción de una línea específica de un archivo, basado en el número de línea con sed.
No hay comentarios:
Publicar un comentario