jqで複数のフィールドを選択するにはどうすればよいですか?


102

私の入力ファイルは次のようになります。

{
"login": "dmaxfield",
"id": 7449977,
...
}
{
"login": "dmaxfield",
"id": 7449977,
...
}

私はこれですべてのログイン名を取得できます: cat members | jq '.[].login'

しかし、ログインとIDの両方を取得するために構文を解読することができませんでしたか?


期待される出力がどのようになるかについての例を教えてください。ログイン/ IDのペアを表す方法はたくさんあります。

回答:


144

を使用jq '.[] | .login, .id'して、各ログインとそれに続くIDを取得できます。


1
ユーザーのサンプル入力はオブジェクトのストリームのように見えますが、ユーザーが提供するサンプルスクリプトのため、省略した配列にラップされていると思います。

1
@SantiagoLapresta:その仮定の必要はありません。jqオブジェクトのシーケンスでうまく機能します-配列ラッパーは必要ありません。...文字列と最後の末尾のコンマの必要性の除去が、私は暗示されるようにすることを検討してください。
ピーターV.Mørch

56
または、これら2つのフィールドのみを表示する場合。jq '.[] | {login, id}'
Cameron Taggart 2017

4
@CameronTaggart、表示したい場合はどうすればよいlogin.nameですか?jq '.[] | {login.name, id}'うまくいくようですが、適切な方法は何ですか?
zyxue 2018年

7
この作品を@zyxue:jq '.[] | {name: .login.name, id}'
アレックスグラウンド

70

これは私のために働きます:

> echo '{"a":1,"b":2,"c":3}{"a":1,"b":2,"c":3}' | jq '{a,b}'
{
  "a": 1,
  "b": 2
}
{
  "a": 1,
  "b": 2
}

これは単純で、私がやりたかったことを正確に実行します。複数の入力オブジェクト/ハッシュを持ち、それらの一部の値のみを取得し、それらをオブジェクトとして出力します。
Smar

11

異なるレベル(つまり、第1レベルと第2レベルの両方)にインデントされている値を選択するには、次を使用できます。

$ echo '[{"a":{"aa":1,"ab":2},"b":3,"c":4},{"a":{"aa":5,"ab":6},"b":7,"c":8}]'|jq '.[]|[.a.aa,.a.ab,.b]'

[
  1,
  2,
  3
]
[
  5,
  6,
  7
]

4

ここにもう1つの例を示します(jq-1.6):

配列をウォークスルーし、オブジェクト要素のフィールドとそのオブジェクト内のオブジェクトのフィールドを選択します

echo '[{"id":1, "private_info": {"name": "Ivy", "age": 18}}, {"id":2, "private_info": {"name": "Tommy", "aga": 18}}]' | jq ".[] | {id: .id, name: .private_info.name}" -

{
  "id": 1,
  "name": "Ivy"
}
{
  "id": 2,
  "name": "Tommy"
}

サンプルデータなし:

jq ".[] | {id, name: .private_info.name}" -

.[]:配列をウォークスルー

{id, name: .private_info.name}:.idと.private_info.nameを取得し、それぞれフィールド名「id」と「name」のオブジェクトにラップします。


構造/キー名を維持するために、オブジェクトへのラッピングは、私が探していますまさに、素晴らしいです
cryanbhu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.