¿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.

J. Groesser
fuente
¿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.


fuente
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
}
Peter V. Mørch
fuente
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
]
vreyespue
fuente
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

WYC
fuente
encajar en el objeto para mantener la estructura / nombres de clave es genial, justo lo que estoy buscando
cryanbhu