Pomocné pmf je odpověď, proč není v této práci?
input.jsonl
:
[{"version": "1.0"}]
{"version": "2.0"}
Příkaz:
jq -c 'if (select(has("version")?)) then [.] else . end'
Aktuální výstup:
[{"version": "2.0"}]
Požadovaný výstup:
[{"version": "1.0"}]
[{"version": "2.0"}]
Za prvé, select
filtry hodnot. Pro každou hodnotu vstupu select
, vyhodnocuje filtru si pak dát je na jeho vstup, a pokud ten filtr vyhodnocuje na hodnotu true, celý vstupní hodnoty vyzařovaného beze změny. Jinak není žádný výstup. Pomocí select
tady je neužitečné, protože chcete, hodnotu true nebo false pro if
stavu. Pokud podmínka součástí vašeho if-then-else
vyjádření vydává žádný výstup pak celý if-then-else
vyjádření vydává žádný výstup.
Důkladnější způsob, jak pochopit select(expr)
je to pokaždé, když expr
vyzařuje skutečnou hodnotu pak select(expr)
vyzařuje jeho vstupní hodnoty. Důkladnější způsob, jak pochopit if cond then a else b end
je to pokaždé, když cond
vyzařuje skutečnou hodnotu celé if-then-else
vydává a
a pokaždé, když se cond
vyzařuje hodnotu false celý if-then-else
vydává b
.
Dobře, takže zapomeňte na select
... proč není v této práci?
Příkaz:
jq -c 'if (has("version")?) then [.] else . end'
Aktuální výstup:
[{"version": "2.0"}]
V tomto případě, ?
je chyba potlačení operátora, a je ekvivalentní try has("version")
což je samo o sobě rovnocenné try has("version") catch empty
. To znamená, že když dojde k chybě výrazu vrátí empty
což znamená žádný výstup. Chyba se skutečně nastat, když je na vstupu seznam místo objektu. Když stav část if-then-else
vyjádření vydává žádný výstup, uhodli jste, celý výraz vyzařuje žádný výstup.
Mohli byste udělat tuto práci tím, že dělá toto místo:
Příkaz:
jq -c 'if (try has("version") catch false) then [.] else . end'
Aktuální výstup:
[{"version":"1.0"}]
[{"version":"2.0"}]
Samozřejmě, že je to trochu kolotoč. Ty by se měly řídit pmf odpověď. Ale to možná pomůže pochopit, proč váš pokus nevyšlo tak, jak jste očekávali.
Jako pravidlo, snažte se ujistěte se, že vaše select
a if
podmínky vždy vyzařují přesně jeden výstup pro každý vstup - tímto způsobem, nebudete překvapeni. Výrazy, které mohou emitovat žádné výstupy (např. expr?
nebo select(...)
), nebo více výstupy (např. .[]
), bude pro matoucí čas, kdy se používá jako podmínky v select
nebo if
.