如何解决如何用'jq'总结包含百分比的字符串字段?
我有一个JSON文件,该文件以百分比形式跟踪表的列宽。因此,输入文件columns.json
如下所示:
[
{
"name": "Column A","width": "33%"
},{
"name": "Column B",{
"name": "Column C",{
"name": "Column D","visible": false
}
]
某些列未显示,因此没有宽度(jq '.[].width
将返回null
),然后还会出现百分号。否则,我可能会用过munge | munge | paste -sd+ | bc
,这通常是我在shell中进行汇总的方法,但是这里看起来很愚蠢,因为jq
应该能够做到这本身。
因此仅使用jq
,我该如何总结此文件 eg 中的width
字段,以确保它们不超过100%?
我尝试过的东西(不起作用)
我在这里使用select(.)
过滤掉没有.width
的记录,然后去除百分号:
jq '[.[].width | select(.) | sub("%"; "")] | add' columns.json
…但这只是连接字符串并返回"333333"
。
在jq
手册页中没有提到“ typecast”一词,因此我认为也许会进行类型推断,将看起来像数字的字符串视为右侧的数字上下文:
jq '[.[].width | select(.) | sub("%"; "") | .+0] | add' columns.json
...但是这只会产生错误消息,例如:
jq: error (at columns.json:18): string ("33") and number (0) cannot be added
解决方法
更短的选择:
map(.width[:-1] | tonumber?) | add
,
This SO answer为我提供了一个tostring
函数的线索,因此,对手册页进行更彻底的搜索后发现,数字的相似函数是tonumber
。
嗯,嗯。我想我期望它被命名为其他名称,例如toint
,这就是为什么在手册页中进行字符串搜索时找不到它的原因。
这是我最终得到的解决方案:
jq 'map(.width | sub("%"; "")? | tonumber) | add' columns.json
我没有用select(.)
从没有null
字段的对象中过滤掉.width
s,而是默默地忽略了sub
中的错误(使用?
),则会删除这些记录。
请注意,map(.width)
只是[.[].width]
的另一种说法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。