No script jq abaixo, quero imprimir a concatenação de e first_name
ou last_name
apenas last_name
.
$ echo '{"first_name": "John", "last_name": "Johnson"}' | jq -c '{
"name": (if (.last_name | startswith(.first_name))
then .last_name
else .first_name + " " + .last_name
end)
}'
O erro é
jq: error (at <stdin>:1): Cannot index string with string "first_name"
O comando jq falha na chamada para startswith
- como se startswith
aceitasse apenas literais de string. Se eu mudar startswith(.first_name)
para startswith("John")
então a expressão compila e funciona como esperado.
No exemplo do mundo real, há muitos registros de entrada e muitos first_name
s diferentes. Existe uma maneira de eu conectar .first_name
em startswith
?
Você está usando
startswith
corretamente, mas com o precedente|
você está iniciando um novo contexto (mantendo o valor de.last_name
) que.first_name
não é mais válido.Em termos gerais, para referenciar um valor posteriormente (quando ele estiver fora do contexto), vincule uma variável a ele quando ele ainda estiver no contexto e use-a mais tarde:
Você também pode vincular o objeto inteiro em um estágio anterior (por exemplo, se precisar de várias referências a ele ou às suas partes):
Ou defina sua própria função que receba dois parâmetros (por exemplo, se você precisar dessa construção com mais frequência):