jq ツールを使用して JSON ファイル内のシェル スクリプトでスタンプを取得する方法は?

jq ツールを使用して JSON ファイル内のシェル スクリプトでスタンプを取得する方法は?

タイムスタンプ付きの json ファイルを作成するためのシェル スクリプトと jq ツールに関して質問があります。

echo "{\"vtg\":[$value]}" | jq -a '. + {date: now|strflocaltime("%r")}' > sample.json 

このコマンドで以下の json ファイルを取得します。

{
 "vtg": [
 11.769,
 11.769,
 11.339,
 11.788,
 11.867,
 11.886,
 11.808,
 11.339,
 11.554,
 11.182
 ],
 "date": "03:31:52 PM"
}

しかし、タイムスタンプはこうしたいのです

"date": [
  15,
  31,
  52
]

いつ

 strptime("%H:%M:%SZ")

タイムスタンプを希望の形式で取得するはずです。しかし、エラーが発生します:

jq: error (at <stdin>:10): strptime/1 requires string inputs and arguments

JSON ファイルでタイムスタンプを取得する方法を誰か教えてくれませんか?

答え1

このstrptime()関数は、解析するフォーマットされた時刻( の逆strftime())。必要なのは ですstrftime()

使用方法jq:

jq -n 'now as $t | { date: [ ($t|strftime("%H")), ($t|strftime("%M")), ($t|strftime("%S")) ] }'

これは、関数strftime()によって指定された時間をフォーマットするために使用されますnowstrflocaltime()時間をローカル時間に変換するために使用します。

もしそれが長すぎる、または非効率的であると思われる場合は(実際には配列strftime()の各要素に対して1回ずつ呼び出しているのですdate!)、HH:MM:SSタイムスタンプを作成することを検討してください。コロンで分割します。

jq -n '{ date: (now | strftime("%H:%M:%S") | split(":")) }'

上記のコマンドのいずれかを実行すると、

{
  "date": [
    "07",
    "01",
    "23"
  ]
}

完全なスクリプト (名前付き配列の値からjo初期配列を安全に作成するために使用します):vtgbash

#!/bin/bash

value=(11.769 11.769 11.339 11.788 11.867 11.886 11.808 11.339 11.554 11.182)

jo vtg="$( jo -a "${value[@]}" )" |
jq '. += now as $t | { date: [ ($t|strftime("%H")), ($t|strftime("%M")), ($t|strftime("%S")) ] }'

# or...

jo vtg="$( jo -a "${value[@]}" )" |
jq '. += { date: (now | strftime("%H:%M:%S") | split(":")) }'

jo当然ながら、次のコマンドから読み取ることで、データの日付セクションをその場で作成することもできますdate

jo vtg="$(  jo -a "${value[@]}" )" \
   date="$( jo -a $( date +'%H %M %S' ) )"

これは、シェルがdateフォーマット文字列内のスペースに基づいて出力を分割することに依存しています。上記からローカル時刻が取得されます。

このjoツールは以下から入手可能です。https://jpmens.net/2016/03/05/a-shell-command-to-create-json-jo/

関連情報