El libre pensamiento para un internet libre
No estas registrado.
Imaginamos la situación siguiente : Tenemos un diccionario con nombres y otro con apellidos.
Queremos hacer un diccionario que combine todos los nombres con todos los apellidos.
Supongo que existen programas o generadores que lo hacen pero no es nada complicado hacerlo nosotros mismos en un pispás con nuestra consola.
Veamos cómo...
Tengo dos listas de palabras:
Una llamada "nombres.txt" que contiene tres nombres : Pepa, François y Günter
Otra llamada "apellidos.txt" que contiene tres apellidos : Martinez, Dubois y Wittgenstein
Podemos abrir los diccionarios y ver el contenido en consola con el comando cat :
cat nombres.txt && cat apellidos.txt
O bien lo podemos hacer con bucle while
while read nombre ; do
echo $nombre
done < nombres.txt
El resultado es lo mismo y esta forma es mas rebuscada pero tiene una ventaja: guardamos el contenido de cada linea en una variable.
Lo que hacemos asi concretamente es mientras leamos el archivo linea por linea guardamos el contenido en una variable ( nombre ) que enseñamos enseguida ( echo $nombre )
El contenido de la variable "nombre" cambia a cada linea y lo enseñamos cada vez.
Notad que el archivo por leer se pone en final de bucle ( done < nombres.txt).
Esto es porque bash lee todo lo que esta en el bucle (entre "while" y "done" que es una instrucción de cierre) antes de ejecutar el código.
Así que podemos (y debemos en el caso de un bucle while ) poner al archivo por leer al final en modo "retro" direccional con el símbolo <
Ahí viene el truco : podemos perfectamente abrir un bucle... en otro bucle.
De esta forma podríamos pillar la primera linea de nuestra lista 1 (nombres) y combinar la con todas la lineas de una segunda lista (apellidos) y hacer lo mismo con la segunda linea de nuestra primera lista (nombres), con la tercera, etc... y esto hasta al final de nuestro lista 1 (nombres)
O sea combinar dos diccionarios para hacer uno.
Veamos mas de cerca la sintaxis con nuestro ejemplo
while read nombre ;
do
while read apellido ;
do
echo "$nombre $apellido"
done < nombres.txt
done < apellidos.txt
Dos cosas :
- Es muy importante que haya una linea con done para cada while... sino no se cierran los bucles y no se ejecutan.
- Veis que además de poner un bucle a dentro del otro he modificado la linea "echo" para que las variables "nombre" y "apellido" se escriban juntas ( echo "$nombre $apellido"), separadas por un espacio (que podríamos quitar)
Obtenemos las 9 combinaciones posibles con nuestras listas de tres nombres y tres apellidos
Aunque podríamos pasar las combinaciones con aircrack-ng al vuelo gracias a un pipe, vamos a ver como guardar lo que pasa en consola para tener el diccionario.
Y de paso vamos a completar lo poniendo las combinaciones apellido y nombre.
De momento tenemos a Martinez pepa, Martinez günter etc... pues tendremos también a pepa Martinez, günter Martinez etc...
Por lo de guardar el fichero lo hacemos con el símbolo de re-dirección doble ( >> ) y ponemos el nombre del archivo que queremos crear ( lo llamare dic_final.txt )
Lo hacemos a nivel de la orden "echo".
"echo" es para escribir en consola pero volcamos el contenido en un fichero de texto (las contrsaeñas no se ven en consola y sol se impriman en el fichero)
Es importantisimo usar la re-dirección con símbolo "doble" (>>) porque hace que vamos a añadir cada combinación la una después de la otra.
Si usamos un solo > las combinaciones se sobrescriben y solo tendremos la ultima combinación en el diccionario
Nuestro linea echo quedaría asi
echo "$nombre $apellido" >> dic_final.txt
Por lo de doblar nuestro diccionario añadiendo las combinaciones " appelidos + nombres" ponemos en el medio de nuestros bucles una segunda linea "echo" invirtiendo el orden de las variables
echo "$nombre $apellido" >> dic_final.txt
echo "$apellido $nombre" >> dic_final.txt
Tenemos
while read nombre ;
do
while read apellido ;
do
echo "$nombre $apellido" >> dic_final.txt
echo "$apellido $nombre" >> dic_final.txt
done < nombres.txt
done < apellidos.txt
Obtengo un diccionario con las 18 combinacionales posibles.
Podríamos hacer una lista con las fechas de nacimiento y añadir un bucle while para usar la
Pero para divertirnos un poco vamos a hacer lo añadiendo un bucle for en nuestro bucle while.
Unas fechas de nacimientos son una secuencia de números.
Para generar secuencias tenemos al comando "sec" que se puede usar directamente en un bucle for
[*]for i in $(seq incio final)
do echo $i
done[/*]
ejemplo, genero los años de las fechas de nacimiento desde 1960 hasta 2000
for i in $(seq 1960 2000)
> do echo $i
> done
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
Tendré mis 18 passes con nombre + apellido y apelido + nombre y ademas 18 x 40 combinaciones con las fechas entre 1960 y 2000.
while read nombre ;
do
while read apellido ;
do
for i in $(seq 1960 2000)
do
echo "$nombre $apellido $i" >> dic_final.txt
echo "$apellido $nombre $i" >> dic_final.txt
done
done < nombres.txt
done < apellidos.txt
importante : el primer "done" es el del ultimo bucle abierto.
Es el bucle for y no se alimenta con un fichero (no lleva el <)
Muchas veces buscamos aplicaciones para cosas que podemos hacer nosotros mismos...
¡Viva bash!
Desconectado
de nuevo gracias por compartir conocimientos.....estos de chuleta pa guardar
esta bien tener conocimiento de mezcla de dicionarios lo mejor de todo lo bien explicado que esta el post de como se hace y explicando los comandos aplicados
salu2
Ultima edición por dynyly (05-02-2016 23:22:29)
Desconectado
Tema | Respuestas | Vistas | Ultimo mensaje |
---|---|---|---|
1 | 50 | Ayer 23:10:27 por wifiyeah | |
19 | 539 | Ayer 18:25:01 por elEstudiante | |
21 | 8768 | 01-02-2023 23:46:07 por kcdtv | |
0 | 175 | 26-01-2023 19:35:15 por kcdtv | |
Pegado: |
24 | 2265 | 26-01-2023 19:00:06 por Koala |
Ultimo usuario registrado: Facu_Hok
Usuarios registrados conectados: 0
Invitados conectados: 12
Número total de usuarios registrados: 2,422
Número total de temas: 1,629
Número total de mensajes: 15,499
Atom tema feed - Impulsado por FluxBB