タイムスタンプ付きのテキストファイルを処理し、毎秒最後の行を出力します。

タイムスタンプ付きのテキストファイルを処理し、毎秒最後の行を出力します。

"YYYY-MM-DDTHH:MM:SS.fffffffffZ"一部のデータに続く形式のナノ秒解像度タイムスタンプを含むcsvファイルがあります。

2021-04-26T09:30:04.786235633Z,102 
2021-04-26T09:30:04.786235633Z,524 
2021-04-26T09:30:04.786235633Z,566 
2021-04-26T09:30:04.791050014Z,391 
2021-04-26T09:30:09.882687589Z,922 
2021-04-26T09:30:09.886405549Z,744 
2021-04-26T09:30:09.886405549Z,702 
2021-04-26T09:30:14.986237837Z,436 
2021-04-26T09:30:14.986237837Z,636 
2021-04-26T09:30:14.986298532Z,353 
2021-04-26T09:30:14.986298532Z,445 
2021-04-26T09:30:14.986298532Z,785 
2021-04-26T09:30:14.986298532Z,917 
2021-04-26T09:30:20.086229659Z,195 
2021-04-26T09:30:20.086229659Z,228 
2021-04-26T09:30:20.086229659Z,486 
2021-04-26T09:30:20.086229659Z,41 
2021-04-26T09:30:20.086229659Z,421 
2021-04-26T09:30:20.090214746Z,386 
2021-04-26T09:30:25.186477272Z,678 
2021-04-26T09:30:25.186477272Z,198 
2021-04-26T09:30:25.190264104Z,459 
2021-04-26T09:30:25.190460283Z,123 
2021-04-26T09:30:25.190460283Z,318 
2021-04-26T09:30:26.442994013Z,200 

そんな風に扱いたいです。1秒あたりの最後の行出力は次のとおりです。

2021-04-26T09:30:04.791050014Z,391 
2021-04-26T09:30:09.886405549Z,702 
2021-04-26T09:30:14.986298532Z,917 
2021-04-26T09:30:20.090214746Z,386 
2021-04-26T09:30:25.190460283Z,318 
2021-04-26T09:30:26.442994013Z,200 

awkなどのツールを使用してこれを実行できますか?

答え1

GNUを使用すると、sort次のことができます。

<file.csv sort -r | sort -suk1,1.19

つまり、sort結果を逆順に並べ替えますが、最初の19文字だけを考慮してサブ秒を無視し(固有の場合)、最初の文字(古い新しい文字と安定した文字のために大きい文字になる-u)の順序を選択します。 )同じ19文字のキーを持つものです。sort-s

また、最初の行の前の行部分をソートキーとして選択する-k1,1.19こともできます。-t. -k1,1.

入力ファイルがすでに時系列でソートされている場合は、最初のファイルを(または一部のシステムでは)sort置き換えることができます。tactail -r

答え2

はい、可能です。最後の秒とその行を追跡し、2番目が変更されるたびに記憶された行を出力します。

awk -F. 'NR > 1 && lastsec != $1 { print lastline }
         { lastsec = $1; lastline = $0 }
         END { if (NR) print }'

答え3

使用Pythongroupbyモジュールのメソッドを結合しますitertools

グループ化は時間(0番目のフィールド)で行われ、グループ内の最後の要素はグループのターゲット行です。

python3 -c 'import itertools as it, sys
fs,rs = ofs,ors = ".","\n"
with open(sys.argv[1]) as f:
  print(*[list(group)[-1].rstrip(rs) for key,group in it.groupby(f,lambda x: x.split(fs)[0]) if key],sep=ors)
' file

ストリーム・エディター sed は、次のように処理できます。

sed -Ee '
  $!N
  /^([^.]+\.).*\n\1/!P
  D
' file

デフォルトでは、2つの連続する行、特に点で区切られた最初のフィールドを比較します。一致しない場合にのみ印刷されます。

答え4

sed 'N;/^\([^.]*\.\).*\n\1/D;P;D' file

コマンドDの主な機能ペアから最初の文字列を削除するだけでなく、バ​​ッファに残っている文字列を使用してスクリプトの先頭から操作を再開します。

関連情報