Comment sélectionner des éléments dans JQ fondée sur la valeur dans le tableau
J'ai un fichier avec des lignes comme ceci:
{"items":["blue","green"]}
{"items":["yellow","green"]}
{"items":["blue","pink"]}
Comment puis-je utiliser jq de choisir et d'afficher uniquement le JSON valeurs de "bleu" dans leurs "articles" tableau?
De sorte que la sortie serait:
{"items":["blue","green"]}
{"items":["blue","pink"]}
Vous devez vous connecter pour publier un commentaire.
Trouvé la réponse
Sur Jan 30, en 2017, un builtin nommé
IN
a été ajouté permettant de tester si un JSON entité est contenue dans un cours d'eau. Il peut également être utilisé pour l'efficacité des tests d'adhésion dans un tableau. Dans le cas présent, l'utilisation serait:Si votre jq n'a pas
IN/1
, alors, aussi longtemps que votre jq afirst/1
, vous pouvez utiliser cet équivalent définition:tout/0
À l'aide de
any/0
ici est relativement inefficace, par exemple, par rapport à l'utilisationany/0
:(Dans la pratique,
index/1
est généralement assez rapide, mais sa mise en œuvre actuellement (jq 1.5 et les versions jusqu'à au moins juillet 2017) n'est pas optimale.)Tout ce que vous avez certainement œuvres, il serait plus correct d'utiliser
contains
. Je voudrais éviter que l'utiliser car il peut conduire à la confusion.index("blue")
est0
et il ne faudrait pas considérer qu'un truthy valeur et pourrait s'attendre à être exclus des résultats.Envisager l'utilisation de ce filtre à la place:
Ceci a l'avantage supplémentaire que cela pourrait fonctionner si vous voulais des articles avec plus d'un match en ajoutant simplement à la matrice.
Comme souligné dans les commentaires, ce n'est pas tout à fait correct. Les chaînes sont comparées à l'aide des sous-chaîne correspondante (
contains
est utilisé de manière récursive) ici.Rétrospectivement,
contains
n'ont pas fonctionné comme je l'aurais cru. À l'aide deindex
œuvres, mais personnellement, je ne voudrais pas l'utiliser. Il y a quelque chose à déterminer si un élément est dans une collection, en recherchant c'est l'index qui se sent mal pour moi. À l'aide decontains
plus de sens pour moi, mais à la lumière de cette information, il ne serait pas l'idéal dans ce cas.Voici une solution qui devrait fonctionner correctement:
Ou pour un plus évolutif si vous voulez être en mesure de correspondre à d'autres valeurs:
jq -n '["foobar","bar","baz"] | [.[] | select( . == "foobar" )] | length > 0'
qui au moins a le potentiel pour lancer la recherche, en parallèle.J'ai eu besoin d'utiliser les "regex" pour la même situation, les objets. (Dans un autre contexte, bien sûr). J'écris le code car je n'ai pas trouver une solution pour mon besoin dans ces pages. Cela peut être utile pour quelqu'un.
Par exemple, pour correspondre à la couleur bleue à l'aide d'une expression régulière:
jqPlay