
Eu tenho um arquivo que se parece com isso:
**********************************
Some notes are here
Year Month Day Hour Minute Second
. . . . . . . . . . . . . . . . .
Abaixo disso, gostaria que as datas aparecessem usando o seguinte 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
Se você quiser saber como consegui esse código, leia a perguntaIntervalo de datas com minutos
A dificuldade nesta questão é a última parte "> file.txt"
. O código atual substitui o que já está no arquivo.txt. Quero que esse loop imprima as datas abaixo das notas do arquivo 'file.txt', para que ele comece a escrever, digamos, na 5ª linha ou algo assim.
Então a saída desejada seria
**********************************
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
Responder1
O redirecionamento usando >
criaria o arquivo de saída para o qual você redireciona ou, se já existir, o truncaria para tamanho zero. Qualquer gravação no arquivo começaria no início do arquivo e os dados seriam gravados sequencialmente. Isso énãoO que você quer fazer.
Redirecionar usando >>
criaria o arquivo de saída ou, se já existir, criarianãotruncá-lo. Qualquer gravação no arquivo aconteceria no final do arquivo. Isto é o que você quer fazer.
Além disso, você tem um erro de sintaxe no código. Presumo que você queira usar uma expansão de chaves no loop:
#!/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
Além disso, este é umextremamenteloop lento, chamando date
um grande número de vezes (4.465 vezes, para ser exato; o número de segmentos de tempo de dez minutos em um mês de 31 dias). Para acelerar as coisas, use o fato de que o GNU date
pode ler um arquivo (aqui, fornecemos os carimbos de data e hora na entrada padrão, que date
lê 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
Isso seria executado em um segundo ou menos.
Também removi o -E
da invocação de grep
porque você não usa uma expressão regular estendida.