Bagaimana cara memilih beberapa bidang di jq

97

File masukan saya terlihat seperti ini:

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

Saya bisa mendapatkan semua nama login dengan ini: cat members | jq '.[].login'

tetapi saya belum bisa memecahkan sintaks untuk mendapatkan login dan id?

J. Groesser
sumber
Dapatkah Anda memberikan contoh seperti apa hasil yang diharapkan? Ada banyak cara untuk menampilkan pasangan login / id.

Jawaban:

138

Anda dapat menggunakan jq '.[] | .login, .id'untuk mendapatkan setiap login diikuti dengan id-nya.


sumber
1
Input sampel pengguna memang terlihat seperti aliran objek, tetapi karena contoh skrip yang mereka sediakan, saya berasumsi bahwa itu dibungkus dalam array yang mereka hilangkan.
1
@SantiagoLapresta: Asumsi itu tidak perlu. jqberfungsi baik dengan urutan objek - tidak perlu pembungkus array. The ...string dan trailing terakhir penghapusan koma kebutuhan, tapi saya menganggap bahwa untuk tersirat.
Peter V. Mørch
55
Atau jika Anda hanya ingin kedua bidang tersebut ditampilkan. jq '.[] | {login, id}'
Cameron Taggart
4
@CameronTaggart, bagaimana jika saya ingin menampilkan login.name? jq '.[] | {login.name, id}'sepertinya berhasil, tolong, apa cara yang benar?
zyxue
6
@zyxue Ini bekerja:jq '.[] | {name: .login.name, id}'
Alex Grounds
64

Ini bekerja untuk saya:

> echo '{"a":1,"b":2,"c":3}{"a":1,"b":2,"c":3}' | jq '{a,b}'
{
  "a": 1,
  "b": 2
}
{
  "a": 1,
  "b": 2
}
Peter V. Mørch
sumber
10

Untuk memilih nilai yang diindentasi ke tingkat yang berbeda (yaitu tingkat pertama dan kedua), Anda dapat menggunakan yang berikut ini:

$ 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
]
vreyespue.dll
sumber
2

Berikan satu contoh lagi di sini (jq-1.6):

Telusuri larik dan pilih bidang dari elemen objek dan bidang objek di objek itu

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"
}

Tanpa data contoh:

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

.[]: berjalan melalui sebuah array

{id, name: .private_info.name}: ambil .id dan .private_info.name dan bungkus menjadi objek dengan nama kolom "id" dan "name"

WYC
sumber
membungkus objek untuk mempertahankan struktur / nama kunci itu bagus, persis apa yang saya cari
cryanbhu