jq(コマンドラインJSONプロセッサ)は、STDINの複数のJSON文字列をマージします。

jq(コマンドラインJSONプロセッサ)は、STDINの複数のJSON文字列をマージします。

jqコマンドを使用して、STDINで2つの異なるJSON文字列をマージしようとしています(ファイルではなくパイプを使用)。試したコマンドは次のとおりです。

curl  ipinfo.io api.ipify.org/?format=json 2>/dev/null | jq -s

出力:

[
  {
    "ip": "139.162.244.103",
    "hostname": "businessproservices.com",
    "city": "London",
    "region": "England",
    "country": "GB",
    "loc": "51.5142,-0.0931",
    "postal": "EC2V",
    "org": "AS63949 Linode, LLC"
  },
  {
    "ip": "139.162.244.103"
  }
]

予想出力:

{
  "ip": "139.162.244.103",
  "hostname": "businessproservices.com",
  "city": "London",
  "region": "England",
  "country": "GB",
  "loc": "51.5142,-0.0931",
  "postal": "EC2V",
  "org": "AS63949 Linode, LLC"
}

ベストアンサー1

コマンドcurlは2つのホストを照会します。それぞれはJSONドキュメントを返します。 jq -sこれを配列の2つの項目として一緒に追加します。最初の項目(たとえば、期待される出力としてレンダリングするなど)を取得するには、次のように要求first(または.[0])します。jq

curl -s ipinfo.io 'api.ipify.org/?format=json' | jq -s 'first'

または、最初から最初のホストを使用します。

curl ipinfo.io

実際にマージこれら2つの文書は、返されたリストにjqコマンドを適用します。add

curl -s ipinfo.io 'api.ipify.org/?format=json' | jq -s 'add'

JSONオブジェクトには同じ名前の複数のキーを含めることはできないため、後続のすべてのキーは変える同等の古いキーを使用して文書jq -s

[
  {
    "ip": "139.162.244.103",
    "hostname": "businessproservices.com",
    "city": "London",
    "region": "England",
    "country": "GB",
    "loc": "51.5142,-0.0931",
    "postal": "EC2V",
    "org": "AS63949 Linode, LLC"
  },
  {
    "ip": "39.62.44.1",
    "country": "UK"
  }
]

その後、これは次にマージされます。

{
  "ip": "39.62.44.1",
  "hostname": "businessproservices.com",
  "city": "London",
  "region": "England",
  "country": "UK",
  "loc": "51.5142,-0.0931",
  "postal": "EC2V",
  "org": "AS63949 Linode, LLC"
}

jq -s add代わりに使用する場合jq -s

おすすめ記事