
У меня есть файл, который выглядит так:
**********************************
Some notes are here
Year Month Day Hour Minute Second
. . . . . . . . . . . . . . . . .
Ниже я хотел бы, чтобы даты отображались с помощью следующего кода
#!/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
Если вы хотите узнать, как я получил этот код, пожалуйста, прочитайте вопросДиапазон дат с минутами
Трудность в этом вопросе заключается в последней части "> file.txt"
. Текущий код перезаписывает то, что уже есть в file.txt. Я хочу, чтобы этот цикл печатал даты под примечаниями файла 'file.txt', так чтобы он начал писать, скажем, с 5-й строки или около того.
Итак, желаемый результат будет таким:
**********************************
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
решение1
Перенаправление с помощью >
создаст выходной файл, на который вы перенаправляете, или, если он уже существует, обрежет его до нулевого размера. Любая запись в файл начнется с начала файла, и данные будут записываться последовательно. Этонетчто ты хочешь делать.
Перенаправление с помощью >>
приведет к созданию выходного файла или, если он уже существует,нетобрезать его. Любая запись в файл будет происходить в конце файла. Это то, что вы хотите сделать.
Кроме того, у вас в коде есть синтаксическая ошибка. Я предполагаю, что вы хотели использовать расширение фигурных скобок в цикле:
#!/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
Кроме того, этоочень сильномедленный цикл, вызывающий date
большое количество раз (4465 раз, если быть точным; количество десятиминутных сегментов времени в 31-дневном месяце). Чтобы ускорить процесс, используйте тот факт, что GNU date
может читать из файла (здесь мы предоставляем временные метки на стандартном вводе, который date
читается с помощью -f -
):
#!/bin/bash
printf '@%s\n' {1262300400..1264978800..600} |
date -f - '+%Y %m %d %H %M %S' |
grep -v '[15]0 00$' >>file.txt
Это займет секунду или меньше.
Я также удалил -E
из вызова, grep
поскольку вы не используете расширенное регулярное выражение.