如何使用jq-1.5为JSON数组生成运行计数器(索引)
用jq-1.5为JSON数组生成带递增索引的输出
我懂你的需求:已经能把JSON里的字符串拆成名字列表,但想给每个名字加上从1开始的运行计数器,之前用--arg尝试递增没成功对吧?咱们直接用jq内置的数组操作就能搞定,不用绕外部变量的弯子。
先回顾你的原始数据和已有的操作:
原始JSON:
{"Actors": "Tom,Dick,Mary"}
你已经实现拆分的命令:
echo '{"Actors": "Tom,Dick,Mary"}' | jq --raw-output '. | ( .Actors | splits( "," ) )'
输出是每行一个名字,但咱们要的是一行里每个名字带对应的序号。
解决方案:用split() + to_entries + map() + join()
直接用这条命令就能得到你想要的格式:
echo '{"Actors": "Tom,Dick,Mary"}' | jq --raw-output '.Actors | split(",") | to_entries | map("\(.value) \(.key + 1)") | join(" ")'
输出结果就是:
Tom 1 Dick 2 Mary 3
一步步解释命令逻辑:
.Actors | split(","):把Actors字段的字符串按逗号拆分,直接得到数组["Tom","Dick","Mary"];to_entries:将数组转换为包含索引和值的对象数组,比如第一个元素会变成{"key":0,"value":"Tom"}(这里key是从0开始的数组索引);map("\(.value) \(.key + 1)"):遍历每个对象,把名字和索引+1(让计数从1开始)拼接成字符串,得到数组["Tom 1","Dick 2","Mary 3"];join(" "):把数组里的所有字符串用空格连接成一行,完美输出你要的格式。
为什么不用--arg?
--arg主要是用来从外部给jq传递静态变量的,不太适合在jq内部处理动态递增的计数器。用jq内置的数组和遍历操作,既能保持逻辑清晰,又能避免外部命令的额外处理。
内容的提问来源于stack exchange,提问作者user1822391
相关产品推荐
相关产品推荐

