Como seleciono vários campos no jq?

103

Meu arquivo de entrada é semelhante a este:

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

Posso obter todos os nomes de login com este: cat members | jq '.[].login'

mas não consegui quebrar a sintaxe para obter o login e a id?

J. Groesser
fonte
Você pode fornecer um exemplo de como sua saída esperada deve ser? Há muitas maneiras de representar os pares login / id.

Respostas:

145

Você pode usar jq '.[] | .login, .id'para obter cada login seguido de seu id.


fonte
1
A entrada de amostra dos usuários se parece com um fluxo de objetos, mas por causa do script de amostra que eles fornecem, estou assumindo que está agrupado em uma matriz que eles omitiram.
1
@SantiagoLapresta: Não há necessidade dessa suposição. jqfunciona muito bem com uma sequência de objetos - não há necessidade do wrapper de array. As ...strings e a última vírgula final precisam ser removidas, mas considero que isso está implícito.
Peter V. Mørch
56
Ou se você quiser que apenas esses dois campos sejam exibidos. jq '.[] | {login, id}'
Cameron Taggart
4
@CameronTaggart, e se eu quiser exibir login.name? jq '.[] | {login.name, id}'parece funcionar, qual é a maneira correta, por favor?
zyxue
7
@zyxue Isso funciona:jq '.[] | {name: .login.name, id}'
Alex Grounds
72

Isso funciona para mim:

> 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
fonte
Isso é simples e faz exatamente o que eu queria fazer: ter vários objetos de entrada / hashes e pegar apenas alguns valores deles, ao mesmo tempo em que os envia como objetos.
Smar
11

Para selecionar valores que são recuados em níveis diferentes (ou seja, primeiro e segundo níveis), você pode usar o seguinte:

$ 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
fonte
4

Basta fornecer mais um exemplo aqui (jq-1.6):

Percorra uma matriz e selecione um campo de um elemento de objeto e um campo de objeto nesse 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"
}

Sem os dados de exemplo:

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

.[]: percorrer uma matriz

{id, name: .private_info.name}: pegue .id e .private_info.name e envolva-os em um objeto com o nome de campo "id" e "nome" respectivamente

WYC
fonte
envolver em objetos para manter a estrutura / nomes de chaves é ótimo, exatamente o que estou procurando
cryanbhu