タイムスタンプ列に基づいて日付と時刻列をマージして追加する

タイムスタンプ列に基づいて日付と時刻列をマージして追加する

次のサンプルデータ項目を含むcsvファイルがあります。

Timestamp,data1,data2
2018 07 16 13:00:00,23,45
2018 07 16 13:10:00,23,45
2018 07 16 13:20:00,23,45
2018 07 16 13:30:00,23,45
2018 07 16 13:50:00,23,45
2018 07 16 14:20:00,23,45
2018 07 16 14:40:00,23,45
2018 07 16 14:50:00,23,45
2018 07 16 15:10:00,23,45
2018 07 16 17:50:00,23,45
2018 07 16 18:10:00,23,45
2018 07 17 10:10:00,23,45
2018 07 18 13:20:00,23,45
2018 07 19 13:30:00,23,45

私がしたいのは、Date&という2つの異なる列を作成することですHour。列Dateには日付が含まれ、列にはHourデータがキャプチャされたすべての時間が含まれます。たとえば、上記のデータに基づいて、次のような出力が必要です(同じファイルに2つの列のみを追加します)。

Date,Hour
2018 07 16,13
2018 07 16,14
2018 07 16,15
2018 07 16,17
2018 07 16,18
2018 07 17,10
2018 07 18,13
2018 07 19,13

たとえば、2018年7月16日に13時間(1つ以上)のエントリがある場合は、その日付と13時間を一度だけ一覧表示し、日付が変更されるまで別の時間でアイテムを処理し続けます。そしてその過程を繰り返してください。

上記のように、ファイルには1日にわたって多数のアイテム(100000以上)があり、1時間にキャプチャされるデータの量は異なります。この問題をどのように解決できますか?私の説明が十分に明確であることを願っています。

ベストアンサー1

使用awk:

awk 'BEGIN{ OFS=FS="," }
  NR==1{ print "Date", "Hour"; next }
  {
    $0=substr($1, 1, 10) FS substr($1, 12, 2)
    if ($0 == prev) next  # skip to next record if record equals prev
    prev=$0               # remember record
  }
  1                       # print record
' file

したがって、日付文字列は最初のフィールドの位置1から始まる最初の10文字で構成され、時刻は位置12で始まる2つの文字から抽出されます。

以前に記憶されたレコードが異なる場合、2つの値とフィールド区切り文字(FS)がレコード()に割り当てられて印刷されます。$0

おすすめ記事