¡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.
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:Explicación:
IFS=$'\n'
para establecer el Separador de Campo Interno como el carácter de nueva línea, de modo que el comandofor
iterará sobre las líneas en lugar de las palabras.cat
para leer el contenido del archivooutput.txt
e iteramos sobre cada línea en el archivo.echo
para imprimir cada línea en la consola.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:Explicación:
for
de estilo C para iterar desde la penúltima línea del archivo hasta la primera línea.awk '{print $2}' output.txt
para extraer la segunda columna de cada línea del archivo.tail -n $(($i+1))
para leer las últimasi+1
líneas de la salida deawk
, de modo que el ciclo itere sobre las líneas en orden inverso.head -n1
para imprimir solo la primera línea de la salida, que es lai+1
-ésima línea contando desde el final del archivo.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.