Làm cách nào để chọn nhiều trường trong jq


97

Tệp đầu vào của tôi trông giống như sau:

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

Tôi có thể nhận được tất cả các tên đăng nhập với cái này: cat members | jq '.[].login'

nhưng tôi đã không thể bẻ khóa cú pháp để lấy cả đăng nhập và id?


Bạn có thể cung cấp một ví dụ về kết quả mong đợi của bạn sẽ như thế nào không? Có nhiều cách để biểu diễn các cặp đăng nhập / id.

Câu trả lời:


138

Bạn có thể sử dụng jq '.[] | .login, .id'để lấy từng thông tin đăng nhập theo sau là id của nó.


1
Đầu vào mẫu của người dùng trông giống như một luồng đối tượng, nhưng do tập lệnh mẫu mà họ cung cấp, tôi giả sử rằng nó được bao bọc trong một mảng mà họ đã bỏ qua.

1
@SantiagoLapresta: Không cần thiết phải có giả định đó. jqhoạt động hiệu quả với một chuỗi các đối tượng - không cần trình bao bọc mảng. Các ...chuỗi và dấu phẩy cuối cùng cần được xóa, nhưng tôi cho rằng điều đó được ngụ ý.
Peter V. Mørch

55
Hoặc nếu bạn chỉ muốn hai trường đó được hiển thị. jq '.[] | {login, id}'
Cameron Taggart

4
@CameronTaggart, nếu tôi muốn hiển thị login.namethì sao? jq '.[] | {login.name, id}'có vẻ hoạt động, xin vui lòng cho biết cách thích hợp là gì?
zyxue

7
@zyxue Điều này hoạt động:jq '.[] | {name: .login.name, id}'
Alex

65

Điều này phù hợp với tôi:

> 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

Để chọn các giá trị được thụt vào các cấp độ khác nhau (tức là cả cấp độ đầu tiên và cấp độ thứ hai), bạn có thể sử dụng như sau:

$ 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
]

3

Chỉ cần cung cấp thêm một ví dụ ở đây (jq-1.6):

Đi qua một mảng và chọn một trường của một phần tử đối tượng và một trường đối tượng trong đối tượng đó

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

Không có dữ liệu mẫu:

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

.[]: đi qua một mảng

{id, name: .private_info.name}: lấy .id và .private_info.name và bọc nó thành một đối tượng có tên trường là "id" và "name" tương ứng


gói vào đối tượng để duy trì cấu trúc / tên khóa thật tuyệt vời, đúng như những gì tôi đang tìm kiếm
cryanbhu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.