
タイムスタンプ付きの 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()
によって指定された時間をフォーマットするために使用されますnow
。strflocaltime()
時間をローカル時間に変換するために使用します。
もしそれが長すぎる、または非効率的であると思われる場合は(実際には配列strftime()
の各要素に対して1回ずつ呼び出しているのですdate
!)、HH:MM:SS
タイムスタンプを作成することを検討してください。弦コロンで分割します。
jq -n '{ date: (now | strftime("%H:%M:%S") | split(":")) }'
上記のコマンドのいずれかを実行すると、
{
"date": [
"07",
"01",
"23"
]
}
完全なスクリプト (名前付き配列の値からjo
初期配列を安全に作成するために使用します):vtg
bash
#!/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/