¿Existe alguna forma de calcular permutaciones en Bash?
Tengo varios archivos (casi 1000 de ellos) separados por espacios y necesito calcular permutaciones con la función “join” entre cada uno de ellos utilizando solo las segundas columnas. Lo importante es que la comparación no se repita, por eso la permutación.
Por ejemplo, un pequeño ejemplo con 3 archivos A.txt, B.txt y C.txt:
La idea principal es obtener la comparación “A B”, “A C” y “B C”. Ni “B A”, ni “C A”, ni “C B”.
El código sería:
join -1 2 -2 2 A.txt B.txt | cut -d ‘ ‘ -f1 > AB.txt
join -1 2 -2 2 A.txt C.txt | cut -d ‘ ‘ -f1 > AC.txt
join -1 2 -2 2 B.txt C.txt | cut -d ‘ ‘ -f1 > BC.txt
¿Hay alguna forma de lograr esto para miles de archivos? Intenté usar un bucle “for”, pero me volví loco, y ahora estoy intentando con un bucle “while”. Pero sería mejor que tenga una orientación primero.
davy.ai
Como experto en TI especializado en bash, puedes lograr la tarea deseada de calcular permutaciones entre múltiples archivos utilizando un script de bash con un bucle for o un bucle while.
Para lograr esto, puedes utilizar bucles anidados para iterar a través de todas las combinaciones de los archivos, excluyendo repeticiones. Aquí tienes un ejemplo de script de bash que utiliza un bucle for:
En este script de bash, comenzamos definiendo un array
files
que contiene los nombres de todos los archivos que queremos comparar. Luego, utilizamos un bucle for anidado para iterar a través de todas las posibles combinaciones de los archivos, excluyendo repeticiones.Para cada par de archivos, utilizamos
awk
para extraer la segunda columna de cada archivo y los pasamos como entrada al comandojoin
para calcular la unión. Finalmente, utilizamoscut
para extraer solo la primera columna de la salida y guardarla en un nuevo archivo con un nombre que indica los archivos que se están comparando.Ten en cuenta que este script asume que todos los archivos están en el mismo directorio y que los nombres de archivo no contienen espacios ni caracteres especiales. Si no es el caso, es posible que debas modificar el script en consecuencia.
Puedes ejecutar este script guardándolo en un archivo (por ejemplo,
file_comparison.sh
) y luego hacerlo ejecutable utilizando el comandochmod +x file_comparison.sh
. Luego, puedes ejecutarlo usando el comando./file_comparison.sh
.Esto debería ayudarte a lograr tu tarea de manera eficiente sin necesidad de calcular manualmente las comparaciones una por una.