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.

¡Bash imprime todo el archivo de una sola vez! (Usando bucle for)

Tengo un archivo cuya información/salida se ve así:

7044 5.2 2:10 7856 4.7 0:27 10819 3.9 0:23 7176 3.3 0:25 7903 2.9 0:30 10850

Estoy intentando imprimir este archivo, paso a paso después de una pausa de 1 segundo… pero bash está imprimiendo todo el archivo de una sola vez.

Desde esta respuesta agregué una línea para cambiar IFS, este comando da:

IFS=$’;’;for f in “$( cat output.txt )” ; do echo $f;sleep 1;done;

También tenga en cuenta que awk ‘{print $1,$2,$3}’ output.txt funciona como se desea, pero los comandos en el bucle for no trabajan iterativamente paso a paso como se deseea.

Otro ejemplo donde el bucle for no funciona como se esperaba:

awk ‘{print $2}’ output.txt | tail -n2 | head -n1

for i in “$( cat output.txt | wc -l )”;do awk ‘{print $2}’ output.txt | tail -n$i | head -n1; sleep 1; done

El anterior código no funciona como se espera.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución

    Para imprimir el archivo paso a paso con una pausa de 1 segundo, necesitamos modificar el comando for del siguiente modo:

    IFS=$'\n'
    for line in $(cat output.txt); do
       echo "$line"
       sleep 1
    done
    

    Explicación:

    • Establecemos IFS=$'\n' para establecer el Separador de Campo Interno como el carácter de nueva línea, de modo que el comando for iterará sobre las líneas en lugar de las palabras.
    • Usamos el comando cat para leer el contenido del archivo output.txt e iteramos sobre cada línea en el archivo.
    • Usamos el comando echo para imprimir cada línea en la consola.
    • Usamos el comando sleep 1 para pausar la ejecución durante 1 segundo antes de imprimir la siguiente línea.

    Esto imprimirá el contenido del archivo output.txt línea por línea con una pausa de 1 segundo después de cada línea.

    En cuanto al segundo ejemplo, el comando for debe modificarse de la siguiente manera:

    for ((i=$(cat output.txt | wc -l)-1; i>=0; i--)); do
        awk '{print $2}' output.txt | tail -n $(($i+1)) | head -n1
        sleep 1
    done
    

    Explicación:

    • Usamos un comando for de estilo C para iterar desde la penúltima línea del archivo hasta la primera línea.
    • Usamos awk '{print $2}' output.txt para extraer la segunda columna de cada línea del archivo.
    • Usamos tail -n $(($i+1)) para leer las últimas i+1 líneas de la salida de awk, de modo que el ciclo itere sobre las líneas en orden inverso.
    • Usamos head -n1 para imprimir solo la primera línea de la salida, que es la i+1-ésima línea contando desde el final del archivo.
    • Usamos el comando sleep 1 para pausar la ejecución durante 1 segundo antes de imprimir la siguiente línea.

    Esto imprimirá la segunda columna de cada línea en el archivo output.txt desde la penúltima línea hasta la primera línea con una pausa de 1 segundo después de cada línea.

Comments are closed.