es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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.

Tags:  , , ,

Answer

  1. Avatar for 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:

    #!/bin/bash
    
    # Array de archivos a comparar
    files=(A.txt B.txt C.txt)
    
    # Iterar a través de cada archivo en el array
    for ((i=0; i<${#files[@]}; i++)); do
    
        # Iterar a través de todos los archivos restantes en el array
        for ((j=$i+1; j<${#files[@]}; j++)); do
    
            # Obtener la segunda columna de cada archivo utilizando awk y calcular la unión
            join -1 2 -2 2 <(awk '{print $2}' "${files[$i]}") <(awk '{print $2}' "${files[$j]}") | cut -d ' ' -f1 > "${files[$i]}_${files[$j]}_comparison.txt"
    
        done
    
    done
    

    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 comando join para calcular la unión. Finalmente, utilizamos cut 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 comando chmod +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.

Comments are closed.