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?


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.


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
}

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
]

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


envolver em objetos para manter a estrutura / nomes de chaves é ótimo, exatamente o que estou procurando
cryanbhu
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.