
次のようなファイルがあります:
**********************************
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 日間の 1 か月の 10 分単位の時間セグメントの数) があります。処理を高速化するには、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
これは 1 秒以内に実行されます。
拡張正規表現を使用していないため、-E
の呼び出しからも削除しました。grep