次のサンプルデータ項目を含む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