
Tengo un archivo que se parece a este:
**********************************
Some notes are here
Year Month Day Hour Minute Second
. . . . . . . . . . . . . . . . .
Debajo de esto, me gustaría que aparezcan las fechas usando el siguiente código
#!/bin/bash
for timestamp in (1262300400..1264978800..600)
do
date -d @"$timestamp" '+%Y %m %d %H %M %S';
done | grep -Ev '[15]0 00$' > file.txt
Si quieres saber cómo obtuve este código, lee la pregunta.Rango de fechas con minutos.
La dificultad en esta pregunta es la última parte "> file.txt"
. El código actual sobrescribe lo que ya está en el archivo.txt. Quiero que este bucle imprima las fechas debajo de las notas del archivo 'file.txt', así que para que comience a escribir en digamos la quinta línea o algo así.
Entonces el resultado deseado sería
**********************************
Some notes are here
Year Month Day Hour Minute Second
. . . . . . . . . . . . . . . . .
2010 01 01 00 00 00
2010 01 01 00 20 00
2010 01 01 00 30 00
2010 01 01 00 40 00
2010 01 01 01 00 00
Respuesta1
Redirigir usando >
crearía el archivo de salida al que redirige o, si ya existe, lo truncaría a tamaño cero. Cualquier escritura en el archivo comenzaría al principio del archivo y los datos se escribirían secuencialmente. Esto esnoque quieres hacer.
Redirigir usando >>
crearía el archivo de salida o, si ya existe, crearía el archivo de salida.notruncarlo. Cualquier escritura en el archivo se realizaría al final del archivo. Esto es lo que quieres hacer.
Además, tiene un error de sintaxis en el código. Supongo que querías usar una expansión de llave en el bucle:
#!/bin/bash
for timestamp in {1262300400..1264978800..600}; do
date -d @"$timestamp" '+%Y %m %d %H %M %S'
done | grep -v '[15]0 00$' >>file.txt
Además, este es unextremadamentebucle lento, llamando date
una gran cantidad de veces (4465 veces, para ser exactos; la cantidad de segmentos de tiempo de diez minutos en un mes de 31 días). Para acelerar las cosas, utilice el hecho de que GNU date
puede leer desde un archivo (aquí proporcionamos las marcas de tiempo en la entrada estándar, que date
se lee usando -f -
):
#!/bin/bash
printf '@%s\n' {1262300400..1264978800..600} |
date -f - '+%Y %m %d %H %M %S' |
grep -v '[15]0 00$' >>file.txt
Esto se ejecutaría en un segundo o menos.
También eliminé la -E
de la invocación de grep
ya que no se utiliza una expresión regular extendida.