シェルスクリプトで複数の日付と時刻を比較する

シェルスクリプトで複数の日付と時刻を比較する

jqコマンドの次の出力があり、すべての日付と時刻を比較してどれが最新であるかを知りたいです。

Mon Feb 20 09:22:25 2023
Mon Feb 20 17:42:13 2023
Thu Mar  2 05:55:07 2023
Tue Feb 28 16:02:40 2023

これを行う方法を案内してください。 2つの日付を比較するために複数の答えがあるようです。日付と時刻の比較方法と、上記のタイムスタンプを特定の形式に変換する必要があるかどうかはわかりません。

ご案内ください

こんにちは、侍

ベストアンサー1

次のJSONドキュメントがあるとします。

[
   { "datestring": "Mon Feb 20 09:22:25 2023" },
   { "datestring": "Mon Feb 20 17:42:13 2023" },
   { "datestring": "Thu Mar  2 05:55:07 2023" },
   { "datestring": "Tue Feb 28 16:02:40 2023" }
]

(質問のデータを使用してこれを生成できますが、jq -Rn '[inputs] | map({datestring: .})'一部のJSON文書に既にこのデータがあるとします。)

...その後、およびを使用してjqこれらの日付文字列をUnixタイムスタンプ(整数)に変換し、これらのタイムスタンプをソートキーとして元の文字列をソートできます。strptime()mktime

jq 'sort_by(.datestring|strptime("%a %b %e %H:%M:%S %Y")|mktime)' file

これにより、サンプル文書の最上位配列の各項目のUnixタイムスタンプが計算されます。指定された特定の書式文字列を使用して、指定された日付文字列を解析し(strptime()この書式文字列の意味についてはシステムのマニュアルを参照)、結果の時間表現を使用して、項目を昇順に並べ替えるUnixタイムスタンプに変換します。strptimemktimesort_by()

上記のサンプル文書を見ると、次のような結果が生成されます。

[
   { "datestring": "Mon Feb 20 09:22:25 2023" },
   { "datestring": "Mon Feb 20 17:42:13 2023" },
   { "datestring": "Tue Feb 28 16:02:40 2023" },
   { "datestring": "Thu Mar  2 05:55:07 2023" }
]

やや効率的なアプローチは、Unixタイムスタンプを事前に計算してソートに使用してから再度削除することです(aシュワルツ変換):

jq 'map(.ts = (.datestring|strptime("%a %b %e %H:%M:%S %Y")|mktime)) | sort_by(.ts) | map(del(.ts))' file

おすすめ記事