Jq: seznam uživatelů patřících do určité skupiny v poli

0

Otázka

vstupní json:

[
  {
    "user": "u1"
  },
  {
    "user": "u2",
    "groups": [
      {
        "id": "100001",
        "name": "G1"
      },
      {
        "id": "100002",
        "name": "G2"
      }
    ]
  },
  {
    "user": "u3",
    "groups": [
      {
        "id": "100001",
        "name": "G1"
      }
    ]
  }
]

Chci najít všechny uživatele patřící do určité skupiny (hledání podle skupiny name nebo skupiny id v groups pole)

$ jq -r '.[]|select(.groups[].name=="G1" | .user)' json
jq: error (at json:27): Cannot iterate over null (null)

Požadovaný výstupní formát, když hledáte například skupina G1 by být:

u2
u3

Další otázka: Je možné vyrábět čárkami oddělený výstup u2,u3 bez použití externích nástrojů, jako je tr?

jq
2021-11-23 08:14:24
2

Nejlepší odpověď

2

Lepší zadat váš prohlížeč dat z parametrů pomocí --arg a použití any aby se zabránilo duplicitní výstupy-li oba vstupy zápas:

jq -r --arg id "" --arg name "G1" '
  .[] | select(.groups | map(.id == $id or .name == $name) | any)? | .user
'
u2
u3

Demo

2021-11-23 08:26:43

To, jak OP může integrovat tento úryvek pomocí např. --arg id "${id}" --arg name "${name}" a nemusí se obtěžovat který actuallay má vyhledávání data. f samozřejmě, pokud OP otázku do vyhledávání "název skupiny nebo id skupiny" bylo, aby implementace jednodušší, ale ve skutečnosti potřebuje jen jeden, jeden bude stačit stejně. - Na konci, všechny proměnné uvnitř filtru také musí být deklarovány mimo.
pmf
1

Pomocí ? jako Nepovinný Identifikátor Objektu-Index operátor, jsi to mohl udělat vyberte níže

map(select(.groups[].name == "G1")? | .user)

a un-wrap výsledky z pole pomocí [] na konci filtru. Kombinovat více výběrových podmínek pomocí logických operátorů s and/or uvnitř select prohlášení

Viz demo na jqplay

2021-11-23 08:21:39

Konečně jsem použít následující příkaz prouce čárkou oddělený seznam. Je to možné, aby se zabránilo externí příkazy a produkovat takový seznam jq? jq -r 'map(select(.skupin[].name == "LSY")? | .uživatele)|@tsv'|tr -s '\t' ','
Chris

@Chris Použití @csv místo @tsv. To vám dává čárky přímo místo listů (nemusíš na vyvolání tr později)
pmf

@pmf děkuji, tam je ještě jeden problém, když použiju @csv ourput je s citáty, takže musím znovu pomocí tr -d \"
Chris

@Chris to proto, CSV vyžaduje. Ale můžete si vytvořit svůj vlastní formát, join(",") například zřetězí pole je řetězec prvky pro větší řetězce s použitím daného řetězce oddělovače (čárka v tomto případě) mezi prvky. Ale pozor, jak jste odešel na vlastní pěst, když to přijde k útěku "speciální" obsahu (jako kdyby hodnotu sám o sobě obsahoval čárku a podobně).
pmf

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................