Json 如何用“jq”对包含百分比的字符串字段求和?
我有一个JSON文件,它以百分比的形式跟踪表的列宽。因此,输入文件columns.json如下所示:Json 如何用“jq”对包含百分比的字符串字段求和?,json,math,type-conversion,jq,Json,Math,Type Conversion,Jq,我有一个JSON文件,它以百分比的形式跟踪表的列宽。因此,输入文件columns.json如下所示: [ { "name": "Column A", "width": "33%" }, { "name": "Column B", "width": "33%" }, { "
[
{
"name": "Column A",
"width": "33%"
},
{
"name": "Column B",
"width": "33%"
},
{
"name": "Column C",
"width": "33%"
},
{
"name": "Column D",
"visible": false
}
]
有些列不显示,因此没有宽度jq'.[]。否则,我可能会使用munge | munge | paste-sd+| bc,这通常是我在shell中总结事情时使用的,但这看起来很愚蠢,因为jq应该能够自己完成这项工作
因此,仅使用jq,我如何汇总此文件中的宽度字段,例如,确保它们不超过100%
我试过但不起作用的东西
我使用select。在此处筛选出没有.width的记录,然后去掉百分号:
jq'[.].width | select.| sub%;]| add'columns.json
…但这只是连接字符串并返回333
我在jq手册页中没有看到任何关于typecast这个词的提及,所以我想它可能会进行类型推断,在正确的上下文中将看起来像数字的字符串视为数字:
jq'[.].width | select.| sub%;|.+0]| add'columns.json
…但这只会产生如下错误信息:
jq: error (at columns.json:18): string ("33") and number (0) cannot be added
给了我一个提示,有一个tostring函数,所以对手册页面进行更彻底的搜索后发现,数字的类似函数是tonumber
嗯,嗯。我想我希望它被命名为其他名称,比如toint,这就是为什么我在搜索手册页时没有找到它的原因
以下是我最终得出的解决方案:
jq’map.width | sub%;?|tonumber |添加'columns.json
而不是选择。为了从没有.width字段的对象中过滤掉空值,我只是默默地忽略sub with?中的错误,这会删除这些记录
注意map.width只是另一种表示[.].width]的方式。给了我一个线索,那就是有一个tostring函数,所以对手册页面进行更彻底的搜索后发现,数字的类似函数是tonumber
嗯,嗯。我想我希望它被命名为其他名称,比如toint,这就是为什么我在搜索手册页时没有找到它的原因
以下是我最终得出的解决方案:
jq’map.width | sub%;?|tonumber |添加'columns.json
而不是选择。为了从没有.width字段的对象中过滤掉空值,我只是默默地忽略sub with?中的错误,这会删除这些记录
请注意,map.width只是表示[.].width]的另一种方式。一个较短的选项:
map(.width[:-1] | tonumber?) | add
较短的备选方案:
map(.width[:-1] | tonumber?) | add
谢谢,这是一个很好的解决方案,我建议对您的答案进行一些修改。你可以告诉我在SED上花了很多时间,因为我甚至没有考虑使用切片而不是搜索和替换。哦,好吧,他们没有清除审查队列。无论如何,标记为可接受的解决方案。干杯谢谢,这是一个很好的解决方案,我建议对您的答案进行一些修改。你可以告诉我在SED上花了很多时间,因为我甚至没有考虑使用切片而不是搜索和替换。哦,好吧,他们没有清除审查队列。无论如何,标记为可接受的解决方案。干杯