¿Cómo selecciono varios campos en jq?


97

Mi archivo de entrada se parece a esto:

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

Puedo obtener todos los nombres de inicio de sesión con esto: cat members | jq '.[].login'

pero no he podido descifrar la sintaxis para obtener tanto el inicio de sesión como la identificación.


¿Puede proporcionar un ejemplo de cómo debería ser su resultado esperado? Hay muchas formas en las que se pueden representar los pares de nombre de usuario / identificación.

Respuestas:


138

Puede utilizar jq '.[] | .login, .id'para obtener cada inicio de sesión seguido de su identificación.


1
La entrada de muestra de los usuarios parece una secuencia de objetos, pero debido a la secuencia de comandos de muestra que proporcionan, supongo que está envuelta en una matriz que omitieron.

1
@SantiagoLapresta: No hay necesidad de esa suposición. jqfunciona muy bien con una secuencia de objetos, sin necesidad del contenedor de matriz. Las ...cadenas y la última coma final deben eliminarse, pero considero que eso está implícito.
Peter V. Mørch

55
O si solo desea que se muestren esos dos campos. jq '.[] | {login, id}'
Cameron Taggart

4
@CameronTaggart, ¿y si quiero mostrar login.name? jq '.[] | {login.name, id}'parece funcionar, ¿cuál es la forma correcta, por favor?
zyxue

6
@zyxue Esto funciona:jq '.[] | {name: .login.name, id}'
Alex Grounds

64

Esto funciona para mi:

> 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

Para seleccionar valores que están sangrados en diferentes niveles (es decir, tanto el primer como el segundo nivel), puede usar lo siguiente:

$ 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

Solo proporcione un ejemplo más aquí (jq-1.6):

Recorra una matriz y seleccione un campo de un elemento de objeto y un campo de objeto en ese objeto

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

Sin los datos de ejemplo:

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

.[]: caminar a través de una matriz

{id, name: .private_info.name}: tome .id y .private_info.name y envuélvalo en un objeto con el nombre de campo "id" y "nombre" respectivamente


encajar en el objeto para mantener la estructura / nombres de clave es genial, justo lo que estoy buscando
cryanbhu
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.