web-dev-qa-db-ja.com

jq json解析の最初の(またはn番目の)要素を取得する

Json内の最初の要素を取得できます[]

$ echo '[{"a":"x", "b":true}, {"a":"XML", "b":false}]' | jq '.[1]'
{
  "a": "XML",
  "b": false
}

ただし、jsonが既に逆アセンブルされている場合(たとえば、「選択」を使用してエントリをフィルタリングした後)、1つのエントリを選択して、ここに表示されるエラーを回避するにはどうすればよいですか?

$ echo '[{"a":"x", "b":true}, {"a":"x", "b":false},{"a":"XML", "b":false}]' | jq '.[] | select( .a == "x")'
{
  "a": "x",
  "b": true
}
{
  "a": "x",
  "b": false
}
$ echo '[{"a":"x", "b":true}, {"a":"x", "b":false},{"a":"XML", "b":false}]' | jq '.[] | select( .a == "x") | .[1]'
jq: error (at <stdin>:1): Cannot index object with number
17
Demian Glait

selectの結果を配列にラップできます。

jq '[.[]|select(.a=="x")][0]' your.json

出力:

{
  "a": "x",
  "b": false
}
24
hek2mgl

jqは first/0last/0nth/1 したがって、この場合はフィルター

  ( map(select(.a == "x")) | first  )
, ( map(select(.a == "x")) | last   ) 
, ( map(select(.a == "x")) | nth(1) )

生産する

{
  "a": "x",
  "b": true
}
{
  "a": "x",
  "b": false
}
{
  "a": "x",
  "b": false
}

追加のストリーミング形式 'first/1''last/1' および 'nth/2' も利用できるため、このデータで

  ( first(.[]  | select(.a == "x")) )   
, ( last(.[]   | select(.a == "x")) )
, ( nth(1; .[] | select(.a == "x")) )

生産する

{
  "a": "x",
  "b": true
}
{
  "a": "x",
  "b": false
}
{
  "a": "x",
  "b": false
}
7
jq170727

mapを使用します

cat raw.json|jq -r -c 'map(select(.a=="x"))|.[1]'

mapfilterを受け取り、配列をフィルタリングします。

このコマンド

cat raw.json|jq -r -c 'map(select(.a=="x"))'

中間結果を与える

[{"a":"x","b":true},{"a":"x","b":false}]

.[1]最初の要素を取る

1
tink