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()の各要素に対して一度呼び出されますdate!)、HH:MM:SSタイムスタンプの生成を検討してください。ひもと入力し、コロンで除算します。

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

上記のコマンドの1つは次のように生成できます。

{
  "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/

おすすめ記事