特定の行からファイルの書き込みを開始

特定の行からファイルの書き込みを開始

次のファイルがあります。

**********************************
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日とする10分期間の回数)と呼ぶ遅いループです。作業を高速化するには、dateGNUがファイルから読み取ることができるという事実を活用してください(ここでは標準入力にタイムスタンプを提供し、datereadを使用します-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秒以内に実行されます。

-Egrepまた、拡張正規表現を使用しないため、通貨から除外されました。

関連情報