如何在jq的startswith函数中使用.fieldname字段?
解决jq中
startswith引用字段的报错问题 问题重现
想要实现逻辑:若last_name以first_name开头则输出last_name,否则输出first_name与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) }'
错误信息:
jq: error (at <stdin>:1): Cannot index string with string "first_name"
错误原因
使用.last_name | startswith(.first_name)时,管道操作会将当前上下文切换为.last_name的字符串值,此时再尝试访问.first_name,相当于在字符串类型上索引字段,自然触发报错。
解决方案
有两种简单的修复方式:
方式1:用变量保存first_name的值
先将first_name存入变量,避免上下文切换导致的字段访问问题:
echo '{"first_name": "John", "last_name": "Johnson"}' | jq -c ' .first_name as $first | { "name": (if .last_name | startswith($first) then .last_name else .first_name + " " + .last_name end) } '
方式2:引用根对象的first_name字段
使用$引用整个输入对象,直接访问根对象下的first_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) }'
两种方式都能正确处理不同first_name的批量记录,针对示例输入的输出结果为:
{"name":"Johnson"}
内容的提问来源于stack exchange,提问作者az5112
相关产品推荐
相关产品推荐

