我最近发现了jq
和gron
。对于我的用例来说,gron
已经足够了,但我有点担心缺乏开发。有些错误一年来都没有解决,而我看到正在jq
积极开发。
所以我想gron
使用来模拟jq
。我认为这并不太难,但我对 的了解jq
有限。
作为示例,我想使用它jq
来获得此输出:
T424f7496c3a01 -14889.86
demo -15030.785
来自此输入:
{
"T424f7496c3a01": {
"remaining": -14889.86,
"ts": 136572.504
},
"demo": {
"remaining": -15030.785,
"ts": 0.515
}
}
我想出了这个jq
脚本来执行此操作:
jq -r '[keys,([.[]|.remaining|round|"\t"+tostring])]|transpose|.[]|add'
但它的可读性远不如
gron | fgrep '.remaining = '
产生
json.T424f7496c3a01.remaining = -18079.105;
json.demo.remaining = -18220.029;
可以使用IFS=" .=;" read
循环轻松解析bash
。
因此,我问了一个长期可维护性的问题:是否有一个简单的脚本jq
可以给我提供一些易于解析的内容bash
?我担心使用jq
上述脚本一个月后我将不知道它是如何工作的......
PS
我选择的答案回答了上述查询。我希望对于标题中提到的查询,即gron
使用进行模拟,也会有一个同样简单的答案jq
。事实上,@Kusalananda 在下面的评论中引用了如何打印 JSON 文件的路径和键值,其中选择的答案足够接近模拟gron
。不幸的是,该解决方案太复杂,无法满足我的长期维护和可读性目标。
使用 将输入对象转换为一组“条目”
to_entries
。每个条目都是一个具有一个key
键(来自对象的键)和一个value
键(对象中该键的值)的对象。从每个条目中挑选出
.key
和相应的.value.remaining
值,并将它们放入一个数组中,通过@tsv
该数组输出制表符分隔的列表。如果您愿意,您可以在循环中读取此内容
IFS=$'\t' read -r the_id remaining
,假设没有键包含文字制表符或换行符。显示中间结果: