escribir en un archivo a partir de cierta línea

escribir en un archivo a partir de cierta línea

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 dateuna 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 datepuede leer desde un archivo (aquí proporcionamos las marcas de tiempo en la entrada estándar, que datese 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 -Ede la invocación de grepya que no se utiliza una expresión regular extendida.

información relacionada