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
的建议。但它似乎不在mac
brew
中。可以使用
go-get
说明将其安装为
hjson cli
。我希望你不介意我在我自己的脚本修复程序中进行了编辑…部分原因是我想让人们了解原始问题的意图。感谢
hjson
的建议。但它似乎不在mac
brew
中。可以使用
go-get
说明将其安装为
hjson cli
。我希望你不介意我在我自己的脚本修复中编辑…部分原因是我想让人们理解原始问题的意图。因此基本上我必须更改
然后(.contents | sort_by(.size)| reverse)
然后。contents |=(sort_by(.size)| reverse)
所以基本上我必须更改
然后(.contents|sort_by(.size)| reverse)
然后.contents|=(sort_by(.size)| reverse)