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?


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.


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
}

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
]

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"


membungkus objek untuk mempertahankan struktur / nama kunci itu bagus, persis apa yang saya cari
cryanbhu
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.