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.

Redireccionar la salida hacia múltiples archivos en un directorio específico en un bucle for en el shell. Para redireccionar la salida hacia múltiples archivos en un directorio específico dentro de un bucle for en el shell, puedes seguir los siguientes pasos: 1. Abre el terminal o la línea de comandos. 2. Dirígete al directorio donde se encuentran los archivos que deseas procesar. 3. Escribe el siguiente comando: “`bash for file in *; do command_that_produces_output > /ruta/del/directorio/$file.txt done “` Asegúrate de reemplazar “/ruta/del/directorio” con la ubicación del directorio específico donde deseas almacenar los archivos de salida. Además, puedes reemplazar “command_that_produces_output” con el comando que genera la salida que deseas redireccionar. Este comando tomará cada archivo en el directorio actual y redireccionará la salida del comando hacia un archivo con el mismo nombre y una extensión “.txt” en el directorio específico. Recuerda que debes tener permisos suficientes para escribir en el directorio específico y que el comando que genera la salida debe ser ejecutable.

Tengo un script que, para cada archivo en un directorio, hace algo con el comando awk.

Para eso, uso un bucle for, pero me gustaría que cada comando awk se ejecute para un archivo y redireccione la salida a otro archivo. Es decir, 1 archivo de origen -> 1 archivo de destino.

Por el momento, mi shell está configurado de la siguiente manera:

#!/bin/bash

FILES="/home/yha/AG2R/*"

for f in $FILES 
do 
    echo "Procesando archivo $f.."; 
    awk -F ';' '$1=="TABLE" && $3=="" {printf "01 %s.\n\n", $2; next} {sub(/CHAR/,"PIC X", $2);printf "   * %s.\n\n     05 %s %s.\n\n", $3, $1, $2;}' $f > temp.cpy
done

Como puedes ver, redirijo la salida a “temp.cpy”, pero solo me devuelve el último archivo del directorio, incluso si pongo todas las transformaciones de mis archivos en ese archivo, esto no es lo que quiero como lo describí al principio. También me gustaría redirigir las salidas a una carpeta específica.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para redirigir la salida a un archivo para cada archivo fuente por separado, puedes modificar el comando awk para que la salida se dirija a un archivo con el mismo nombre pero con una extensión diferente, en un directorio especificado. Aquí tienes un ejemplo:

    #!/bin/bash
    
    SOURCE_DIR="/home/yha/AG2R"
    TARGET_DIR="/home/yha/output"
    
    for f in "$SOURCE_DIR"/*
    do
        if [[ -f "$f" ]]; then
            echo "Procesando archivo $f.."
            target="$TARGET_DIR/$(basename "${f%.*}").cpy"
            awk -F ';' '
                $1=="TABLE" && $3=="" {
                    printf "01 %s.\n\n", $2;
                    next
                }
                {
                    sub(/CHAR/,"PIC X", $2);
                    printf "   * %s.\n\n     05 %s %s.\n\n", $3, $1, $2;
                }' "$f" > "$target"
        fi
    done
    

    En este script modificado, primero verificamos que cada elemento en el directorio sea un archivo utilizando [[ -f "$f" ]], para evitar el procesamiento de directorios u otros elementos que no sean archivos.

    Luego, establecemos la ruta del archivo de destino utilizando basename "${f%.*}" para extraer el nombre del archivo sin la extensión, y luego agregamos la nueva extensión .cpy en el directorio de destino.

    Finalmente, utilizamos awk para realizar la transformación como antes, pero redirigimos la salida a $target en lugar de temp.cpy.

    De esta manera, cada archivo fuente tendrá su propio archivo de destino correspondiente en el directorio especificado.

Comments are closed.