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.