【问题标题】:jq string concatenation produces cartesian product?jq字符串连接产生笛卡尔积?
【发布时间】:2021-03-24 08:31:50
【问题描述】:

我正在尝试连接并输出一个对象中的两个字段,但我得到的是笛卡尔积

我的输入数据(data1.json)

{"name":"asdf","loc":"lxd2","mem":332320768}
{"name":"ghjk","loc":"lxd1","mem":307908608}
{"name":"qwer","loc":"lxd1","mem":1195794432}
{"name":"tyui","loc":"lxd2","mem":269889536}
{"name":"zxcv","loc":"lxd1","mem":1578475520}
{"name":"bnml","loc":"lxd2","mem":48967680}

我想生成一个按 loc 分组的输出,其中包含 loc 作为标题和 name + mem 下面的字段。如果我只尝试我得到的名字:

jq -rs 'group_by(.loc)[] | ([.[].loc] | first) + " ---------------------",("\(.[].name)")  ' /tmp/data1.json
lxd1 ---------------------
ghjk
qwer
zxcv
lxd2 ---------------------
asdf
tyui
bnml

到目前为止一切都很好,但是一旦我尝试添加第二个字段,它就会产生笛卡尔积:

$ jq -rs 'group_by(.loc)[] | ([.[].loc] | first) + " ---------------------",("\(.[].name) \(.[].mem/1024/1024|floor)")  ' /tmp/data1.json | less
lxd1 ---------------------
ghjk 293
qwer 293
zxcv 293
ghjk 1140
qwer 1140
zxcv 1140
ghjk 1505
qwer 1505
zxcv 1505
lxd2 ---------------------
asdf 316
tyui 316
bnml 316
asdf 257
tyui 257
bnml 257
asdf 46
tyui 46
bnml 46

我想要的是:

lxd1 ---------------------
ghjk 293
qwer 1140
zxcv 1505
lxd2 ---------------------
asdf 316
tyui 257
bnml 46

我在这里做错了什么?

【问题讨论】:

  • nos, 293, 1140 是从哪里来的?

标签: json group-by jq


【解决方案1】:
jq -rs 'group_by(.loc)[] | ([.[].loc] | first) + " ---------------------",(.[] | "\(.name) \(.mem/1024/1024|floor)")  ' /tmp/data1.json

您需要先处理每个元素,然后通过管道传输您想要显示的信息,您已经拥有数组的每个对象中的所有内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 2015-08-08
    • 2018-04-04
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多