Como contar itens no objeto JSON usando a linha de comando?


179

Estou recebendo esse tipo de JSONresposta de um curlcomando:

[
  {
    "cid": 49,
    "pyn": "yi4",
    "hans": "亿",
    "hant": "億",
    "tid": 68,
    "l10n": "cent million",
    "pid": 1,
    "pos": "num",
    "pos_txt": ""
  },
  {
    "cid": 50,
    "pyn": "yi4",
    "hans": "亿",
    "hant": "億",
    "tid": 69,
    "l10n": "100 millions",
    "pid": 1,
    "pos": "num",
    "pos_txt": ""
  }
]

Como posso contar o número de itens na matriz (aqui 2), usando Bashou uma linha de comando (por exemplo underscore)?


A solução JavaScript é adequada para você?
precisa saber é o seguinte

Através do NPMmódulo sim. Caso contrário, não.
Édouard Lopez

Verifique minha solução. Isso não precisa de npm. JavaScript simples.
precisa saber é o seguinte

1
Estou num contexto bash, não web
Édouard Lopez

Você sabe que pode executar JavaScript no shell, certo?
thefourtheye

Respostas:


358

Apenas jogando outra solução na mistura ...

Experimente jq, um processador JSON de linha de comando leve e flexível:

jq length /tmp/test.json

Imprime o comprimento da matriz de objetos.


4
Seu jqcódigo inicial ( .[]) retorna o comprimento de cada um objectna matriz raiz, enquanto eu estou procurando o comprimento da matriz raiz. Precisa corrigir para.
Édouard Lopez

11
Se sua raiz não é uma matriz, mas um objeto com uma chave que contém uma matriz, ou seja, {"key": [elem1, elem2]}, então você pode usar o usojq '.[] | length' file.json
bitek

8
Ferramenta incrível, jqé. +1
Ory Band

Outra opção útil para esse @MnemonicFlow é jq map_values(length) file.json. Isso lhe dará as chaves também.
Paulo Casaretto

3
E se a sua entrada é feita de objetos independentes em vez de uma única matriz, você pode usar o -sou --slurpopção, que os recolhe em uma matriz enquanto lia:jq -s length file.json
hemflit

42

A expressão mais curta é

curl 'http://…' | jq length

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.