"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
置き換えることができます。tac
tail -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の主な機能ペアから最初の文字列を削除するだけでなく、バッファに残っている文字列を使用してスクリプトの先頭から操作を再開します。