Jak liczyć elementy w obiekcie JSON za pomocą wiersza poleceń?

179

Otrzymuję taką JSONodpowiedź z curlpolecenia:

[
  {
    "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": ""
  }
]

Jak mogę policzyć liczbę elementów w tablicy (tutaj 2), używając Bashlub wiersza poleceń (np. underscore)?

Édouard Lopez
źródło
Czy rozwiązanie JavaScript jest dla Ciebie w porządku?
thefourtheye
Poprzez NPMmoduł tak. W przeciwnym razie nie.
Édouard Lopez
Sprawdź moje rozwiązanie. To nie wymaga npm. Zwykły JavaScript.
thefourtheye
1
Jestem w kontekście basha, a nie w sieci
Édouard Lopez
Wiesz, że możesz uruchomić JavaScript w powłoce, prawda?
thefourtheye

Odpowiedzi:

358

Po prostu wrzucam kolejny roztwór do miksu ...

Wypróbuj jqlekki i elastyczny procesor JSON z wiersza poleceń:

jq length /tmp/test.json

Wyświetla długość tablicy obiektów.

Rozpoznać
źródło
4
Twój jqkod początkowy ( .[]) zwraca długość każdego z nich objectw tablicy głównej, podczas gdy ja szukam długości samej tablicy głównej. Trzeba naprawić.
Édouard Lopez
11
Jeśli twój root nie jest tablicą, ale obiektem z kluczem, który zawiera tablicę, tj. {"Key": [elem1, elem2]}, możesz użyć usejq '.[] | length' file.json
bitek
8
To niesamowite narzędzie jq. +1
Ory Band
Inną przydatną opcją dla tego @MnemonicFlow jest jq map_values(length) file.json. To również da ci klucze.
Paulo Casaretto
3
A jeśli dane wejściowe składają się z niezależnych obiektów zamiast pojedynczej tablicy, -s--slurpjq -s length file.json
użyłbyś
42

Najkrótszym wyrażeniem jest

curl 'http://…' | jq length
nikolay
źródło
3

Prostym rozwiązaniem jest instalacja jshonbiblioteki:

jshon -l < /tmp/test.json
2
Édouard Lopez
źródło