Json “jq”和#x27;s'walk'在行走时有排序问题吗?
我有一个小的Json “jq”和#x27;s'walk'在行走时有排序问题吗?,json,recursion,tree,jq,Json,Recursion,Tree,Jq,我有一个小的jq用于我想按树的大小反向排序的地方。我知道可以使用du-h和sort-h等,但我正在尝试使用tree的json输出和jq 它看起来像: {"type":"report","size":1310049,"directories":24,"files":15} $tree-h-pug-du-nA-J perl5|\ awk-vrs='{gsub(/,[[:space:]*]/,“\n],$0)}1'|\ jq' 行走(如果类型==“对象”且具有(“内容”) 然后(.content
jq
用于我想按树的大小反向排序的地方。我知道可以使用du-h
和sort-h
等,但我正在尝试使用tree
的json输出和jq
它看起来像:
{"type":"report","size":1310049,"directories":24,"files":15}
$tree-h-pug-du-nA-J perl5|\
awk-vrs='{gsub(/,[[:space:]*]/,“\n],$0)}1'|\
jq'
行走(如果类型==“对象”且具有(“内容”)
然后(.contents | sort_by(.size)| reverse)
否则,"完"
jq:错误(位于:65):无法为字符串为“size”的数组编制索引
因此,为了解包,使用了awk
,因为树
的json输出在目录的内容
数组中的最后一个文件或目录后包含额外的逗号。
输入的第65行包含报告
,如下所示:
{"type":"report","size":1310049,"directories":24,"files":15}
它不包含内容
,因此if
应该避免它
下面是一些简单的测试用例:
$echo'
{“a”:0,“c”:[
{“a”:1,“s”:3},
{“a”:2,“s”:4}]}'|jq-c'
行走(如果类型==“对象”且具有(“c”)和(.c|length)>0
然后(.c |按(.s)排序|反向)
否则,"完"
[{“a”:2,“s”:4},{“a”:1,“s”:3}]
$echo'
{“a”:0,“c”:[
{“a”:1,“s”:3,“c”:[
{“a”:1,“s”:5},
{a:2,“s:6}]},
{“a”:2,“s”:4}]}'|jq-c'
行走(如果类型==“对象”且具有(“c”)和(.c|length)>0
然后(.c |按(.s)排序|反向)
否则,"完"
jq:错误(位于:1):无法索引字符串为“s”的数组
我不确定我是否理解此错误消息以及关于
walk
我所缺少的内容。您帖子中walk
的参数不正确
您可能想更新.contents
的值,即:
walk(if type == "object" and has("contents")
then .contents |= (sort_by(.size)|reverse)
else . end)
(在jq的最新(1.6版之后)版本中,可以省略else.
子句。)
附笔
tree
的1.8版修复了后面的逗号问题
如果您的树在使用-J选项时生成无效的JSON,而不是使用诸如awk
之类的通用文本处理工具,则最好使用诸如“清理”伪JSON之类的工具,例如
tree .... | hjson -j | jq ...
p、 附言。
为了理解为什么当错误表达式被用作Wave的参数时,让我们考虑OP中的简单测试用例,但是用一个额外的<代码>调试< /COD>插入,这样我们就可以看到发生了什么:
echo '
{"a":0, "c":[
{"a":1,"s":3, "c":[
{"a":1,"s":5},
{"a":2,"s":6}]
},
{"a":2,"s":4}]
}' | jq -c '
walk(if type == "object" and has("c")
then debug | .c | sort_by(.s) | reverse
else . end)'
(我省略了length
检查,因为它会把代码弄得乱七八糟。)
这将产生:
["DEBUG:",{"a":1,"s":3,"c":[{"a":1,"s":5},{"a":2,"s":6}]}]
["DEBUG:",{"a":0,"c":[[{"a":2,"s":6},{"a":1,"s":5}],{"a":2,"s":4}]}]
jq: error (at <stdin>:6): Cannot index array with string "s"
[“DEBUG:”,{“a”:1,“s”:3,“c”:[{“a”:1,“s”:5},{“a”:2,“s”:6}]
[“调试:,{a:0,c:[[{a:2,s:6},{a:1,s:5}],{a:2,s:4}]
jq:错误(位于:6):无法索引字符串为“s”的数组
现在我们可以看到问题了:第二行调试显示.c有点混乱:第一项是数组。这是因为我们用数组替换了.c。正是由于这个原因,尝试使用排序依据(.s)
失败
为了更全面地理解这一点,有必要检查walk
的定义,这很容易做到:你可以用谷歌jq“def walk”
或转到源代码:你文章中walk
的参数不正确
您可能想更新.contents
的值,即:
walk(if type == "object" and has("contents")
then .contents |= (sort_by(.size)|reverse)
else . end)
(在jq的最新(1.6版之后)版本中,可以省略else.
子句。)
附笔
tree
的1.8版修复了后面的逗号问题
如果您的树在使用-J选项时生成无效的JSON,而不是使用诸如awk
之类的通用文本处理工具,则最好使用诸如“清理”伪JSON之类的工具,例如
tree .... | hjson -j | jq ...
p、 附言。
为了理解为什么当错误表达式被用作Wave的参数时,让我们考虑OP中的简单测试用例,但是用一个额外的<代码>调试< /COD>插入,这样我们就可以看到发生了什么:
echo '
{"a":0, "c":[
{"a":1,"s":3, "c":[
{"a":1,"s":5},
{"a":2,"s":6}]
},
{"a":2,"s":4}]
}' | jq -c '
walk(if type == "object" and has("c")
then debug | .c | sort_by(.s) | reverse
else . end)'
(我省略了length
检查,因为它会把代码弄得乱七八糟。)
这将产生:
["DEBUG:",{"a":1,"s":3,"c":[{"a":1,"s":5},{"a":2,"s":6}]}]
["DEBUG:",{"a":0,"c":[[{"a":2,"s":6},{"a":1,"s":5}],{"a":2,"s":4}]}]
jq: error (at <stdin>:6): Cannot index array with string "s"
[“DEBUG:”,{“a”:1,“s”:3,“c”:[{“a”:1,“s”:5},{“a”:2,“s”:6}]
[“调试:,{a:0,c:[[{a:2,s:6},{a:1,s:5}],{a:2,s:4}]
jq:错误(位于:6):无法索引字符串为“s”的数组
现在我们可以看到问题了:第二行调试显示.c有点混乱:第一项是数组。这是因为我们用数组替换了.c。正是由于这个原因,尝试使用排序依据(.s)
失败
为了更全面地理解这一点,有必要检查walk
的定义,这很容易做到:您可以通过谷歌jq“def walk”
或访问源代码:感谢hjson
的建议。但它似乎不在macbrew
中。可以使用go-get
说明将其安装为hjson cli
。我希望你不介意我在我自己的脚本修复程序中进行了编辑…部分原因是我想让人们了解原始问题的意图。感谢hjson
的建议。但它似乎不在macbrew
中。可以使用go-get
说明将其安装为hjson cli
。我希望你不介意我在我自己的脚本修复中编辑…部分原因是我想让人们理解原始问题的意图。因此基本上我必须更改然后(.contents | sort_by(.size)| reverse)
到然后。contents |=(sort_by(.size)| reverse)
所以基本上我必须更改然后(.contents|sort_by(.size)| reverse)
到然后.contents|=(sort_by(.size)| reverse)