Awkまたは代替を使用して新しい論理行を順番に挿入する

Awkまたは代替を使用して新しい論理行を順番に挿入する

次の形式の生データ行 50 個があります。

09-06-16 16:45:00 1100000000
09-06-16 17:00:00 1200000000
09-06-16 17:15:00
1300000000
09-06-00 0 16 17 :45:00 1500000000

コマンドを使用するか、シーケンスの末尾に新しい行を追加するスクリプトを作成したいと思います。データの単一行は時間を15分間隔で進める必要があり、数字も100000000ずつ増やしたいと思います。しかし、データ生成をシミュレートするためにcrontabスクリプトを作成する予定です。したがって、日付は状況によって変更されることがあります。値が1500000000の場合は、1100000000に戻りたいと思います。

私は常に50個のデータポイントがあるように、データの最初の行(私のレベルではより多く)を削除するスクリプトを書いています。

どんな助けでも大変感謝します。

答え1

私はperlこれを使ってすべてを完了します。

perl -MTime::Piece -i -lne '
  print unless $. == 1; # remove first line
  if (eof) {
    ($t, $n) = /(.*) (.*)/;
    $t = Time::Piece->strptime($t, "%y-%m-%d %T") + 60*15;
    $n += 1e8; $n = 11e8 if $n > 15e8;
     print $t->strftime("%y-%m-%d %T $n")
  }' your-file

Time::Piece5.10に追加されました。以前のバージョンでは、いつでも次のものを使用できますPOSIX::mktime

perl -MPOSIX -i -lne '
  print unless $. == 1; # remove first line
  if (eof) {
    ($y, $mo, $d, $h, $mi, $s , $n) = /(..)-(..)-(..) (..):(..):(..) (.*)/;
    $t = mktime($s, $mi, $h, $d, $mo-1, $y+100) + 60*15;
    $n += 1e8; $n = 11e8 if $n > 15e8;
    print strftime("%y-%m-%d %T $n", localtime $t)
  }'

関連情報