Json 如何用“jq”对包含百分比的字符串字段求和?

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%" }, { "

我有一个JSON文件,它以百分比的形式跟踪表的列宽。因此,输入文件columns.json如下所示:

[
  {
    "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上花了很多时间,因为我甚至没有考虑使用切片而不是搜索和替换。哦,好吧,他们没有清除审查队列。无论如何,标记为可接受的解决方案。干杯