使JQ输出表格

3
我的问题是:如何使JQ以表格格式输出,并用0替换缺失值?
因此,JQ的输入是以下Elastic Search JSON响应:
{"aggregations": {
    "overall": {
        "buckets": [
            {
                "key": "2018-01-18T00:00:00.000Z-2018-01-25T19:33:16.010Z",
                "from_as_string": "2018-01-18T00:00:00.000Z",
                "to": 1516908796010,
                "to_as_string": "2018-01-25T19:33:16.010Z",
                "doc_count": 155569,
                "agg_per_name": {
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0,
                    "buckets": [
                        {
                            "key": "ASSET-DD583",
                            "doc_count": 3016,
                            "totalMaxUptime_perDays": {
                                "buckets": [
                                    {
                                        "key_as_string": "2018-01-22T00:00:00.000Z",
                                        "key": 1516579200000,
                                        "doc_count": 161,
                                        "totalMaxUptime": {
                                            "value": 77598
                                        }
                                    },
                                    {
                                        "key_as_string": "2018-01-23T00:00:00.000Z",
                                        "key": 1516665600000,
                                        "doc_count": 251,
                                        "totalMaxUptime": {
                                            "value": 80789
                                        }
                                    },
                                    {
                                        "key_as_string": "2018-01-24T00:00:00.000Z",
                                        "key": 1516752000000,
                                        "doc_count": 192,
                                        "totalMaxUptime": {
                                            "value": 56885
                                        }
                                    },
                                    {
                                        "key_as_string": "2018-01-25T00:00:00.000Z",
                                        "key": 1516838400000,
                                        "doc_count": 2088,
                                        "totalMaxUptime": {
                                            "value": 7392705
                                        }
                                    }
                                ]
                            }
                        },
                        {
                            "key": "ASSET-DD568",
                            "doc_count": 2990,
                            "totalMaxUptime_perDays": {
                                "buckets": [
                                    {
                                        "key_as_string": "2018-01-18T00:00:00.000Z",
                                        "key": 1516233600000,
                                        "doc_count": 106,
                                        "totalMaxUptime": {
                                            "value": 31241
                                        }
                                    },
                                    {
                                        "key_as_string": "2018-01-19T00:00:00.000Z",
                                        "key": 1516320000000,
                                        "doc_count": 241,
                                        "totalMaxUptime": {
                                            "value": 2952565
                                        }
                                    },
                                    {
                                        "key_as_string": "2018-01-20T00:00:00.000Z",
                                        "key": 1516406400000,
                                        "doc_count": 326,
                                        "totalMaxUptime": {
                                            "value": 2698235
                                        }
                                    },
                                    {
                                        "key_as_string": "2018-01-21T00:00:00.000Z",
                                        "key": 1516492800000,
                                        "doc_count": 214,
                                        "totalMaxUptime": {
                                            "value": 85436
                                        }
                                    },
                                    {
                                        "key_as_string": "2018-01-22T00:00:00.000Z",
                                        "key": 1516579200000,
                                        "doc_count": 279,
                                        "totalMaxUptime": {
                                            "value": 83201
                                        }
                                    },
                                    {
                                        "key_as_string": "2018-01-23T00:00:00.000Z",
                                        "key": 1516665600000,
                                        "doc_count": 50,
                                        "totalMaxUptime": {
                                            "value": 96467
                                        }
                                    },
                                    {
                                        "key_as_string": "2018-01-24T00:00:00.000Z",
                                        "key": 1516752000000,
                                        "doc_count": 5,
                                        "totalMaxUptime": {
                                            "value": 903
                                        }
                                    },
                                    {
                                        "key_as_string": "2018-01-25T00:00:00.000Z",
                                        "key": 1516838400000,
                                        "doc_count": 1769,
                                        "totalMaxUptime": {
                                            "value": 12337946
                                        }
                                    }
                                ]
                            }
                        },
                        {
                            "key": "ASSET-42631",
                            "doc_count": 2899,
                            "totalMaxUptime_perDays": {
                                "buckets": [
                                    {
                                        "key_as_string": "2018-01-18T00:00:00.000Z",
                                        "key": 1516233600000,
                                        "doc_count": 132,
                                        "totalMaxUptime": {
                                            "value": 39054
                                        }
                                    },
                                    {
                                        "key_as_string": "2018-01-19T00:00:00.000Z",
                                        "key": 1516320000000,
                                        "doc_count": 172,
                                        "totalMaxUptime": {
                                            "value": 47634
                                        }
                                    },
                                    {
                                        "key_as_string": "2018-01-20T00:00:00.000Z",
                                        "key": 1516406400000,
                                        "doc_count": 214,
                                        "totalMaxUptime": {
                                            "value": 68264
                                        }
                                    },
                                    {
                                        "key_as_string": "2018-01-21T00:00:00.000Z",
                                        "key": 1516492800000,
                                        "doc_count": 220,
                                        "totalMaxUptime": {
                                            "value": 66243
                                        }
                                    },
                                    {
                                        "key_as_string": "2018-01-25T00:00:00.000Z",
                                        "key": 1516838400000,
                                        "doc_count": 128,
                                        "totalMaxUptime": {
                                            "value": 47660
                                        }
                                    }
                                ]
                            }
                        }
                    ]
                }
            }
        ]
    }
}
}

这个JSON有一些固有属性:

  1. agg_per_name.buckets中的桶数量会变化。
  2. TotalMaxUptime_perDays.buckets代表了从当前日期往前7天的每一天的分组。对于每一个资产,totalMaxUptime_perDays.buckets将会有1到8个不等的桶,每个桶对应一个特定的日期。

给出样例,期望JQ的输出是一个表格,在水平方向上有key_as_string中的日期(在此示例中为2018年1月18日至2018年1月25日),在垂直方向上有所有资产键(例如ASSET-DD583、ASSET-DD568等)。表格中填充了相应日期的totalMaxUptime.value值,如果结果中不存在该日期,则应该用“0”值代替:

XXXXXXXXXXX, 2018-01-18, 2018-01-19, 2018-01-20, 2018-01-21, 2018-01-22, 2018-01-23, 2018-01-24, 2018-01-25
ASSET-DD583, 0,           0,           0,         0,          77598,      80789,      56885,      7392705
ASSET-DD568, 31241,       2952565,     2698235,   85436,      83201,      96467,      903,        12337946
ASSET-42631, 39054,       47634,       68264,     66243,      0,          0,          0,          47660

编辑 1:

这是我目前的进展:

input.json | jq '.aggregations.overall.buckets[0].agg_per_name.buckets[] | .key + ", " + (.totalMaxUptime_perDays.buckets[] | .key_as_string + ", " + (.totalMaxUptime.value | tostring))' | sed 's/"//g' | sed 's/T00:00:00.000Z//g'> uptime.csv

这会产生以下类型的输出:

ASSET-DD583, 2018-01-22, 77598
ASSET-DD583, 2018-01-23, 80789
ASSET-DD583, 2018-01-24, 56885
ASSET-DD583, 2018-01-25, 7392705
...............

1
目标是让你添加一些自己的代码,以展示你为解决这个问题所做的至少研究努力。 - Cyrus
@Cyrus 很抱歉。希望这可以帮到你。我的问题基本上是我不知道如何在特定日期缺少数据时添加0。谢谢。 - am1991
4个回答

7
在接下来的内容中,我使用了@tsv以便更容易地将输出展示为表格,但你可能想使用@csv
这里的棘手之处在于要把0放在正确的位置。创建JSON“字典”(即JSON对象)可以轻松解决此问题。这里,normalize利用了jq会遵循向对象添加键的顺序的事实。
def dates:
  ["2018-01-18", "2018-01-19", "2018-01-20", "2018-01-21", "2018-01-22", "2018-01-23", "2018-01-24", "2018-01-25"];

def normalize:
  . as $in 
  | reduce dates[] as $k ({}; .[$k] = ($in[$k] // 0));

(["Asset"] + dates),
(.aggregations.overall.buckets[].agg_per_name.buckets[]
 | .key as $asset
 | .totalMaxUptime_perDays.buckets
 | map( { (.key_as_string | sub("T.*";"") ): .totalMaxUptime.value } ) 
 | add
 | normalize
 | [$asset] + [.[]]
 )
| @tsv

您可能想修改上述内容,以便从数据中计算dates

输出:

Asset   2018-01-18  2018-01-19  2018-01-20  2018-01-21  2018-01-22  2018-01-23  2018-01-24  2018-01-25
ASSET-DD583 0   0   0   0   77598   80789   56885   7392705
ASSET-DD568 31241   2952565 2698235 85436   83201   96467   903 12337946
ASSET-42631 39054   47634   68264   66243   0   0   0   47660

编辑:已经添加了括号$in[$k] // 0


1
你可以使用 @csvjoin(","),然后将 jq 的输出导入到 column -ts, 中。 - hek2mgl
谢谢@peak,它非常好用!一个问题:为什么“0”没有显示? - am1991
正如CataTudorache所指出的那样,缺少了一对括号。(感谢@CataTudorache!) - peak

5

您的问题可以采用部分解决方案。

如果使用@csv,您可以将数组的值放在同一行上。

例如,假设您有:

{
  "a": [1,2,3],
  "b": [
    {
      "x": 10
    },
    {
      "x": 20
    },
    {
      "x": 30
    }
  ]
}

要获取 1,2,3,您应该使用 jq '.a | @csv'

要获取 10,20,30,您应该使用 jq '[.b[].x] | @csv'

希望这有所帮助!


这很有帮助。谢谢! - am1991

1
有一个相关工具。 https://github.com/uzimaru0000/tv
$ curl -s https://jsonplaceholder.typicode.com/users | tv
+--+------------------------+----------------+-------------------------+-------+---------------------+-------------+-------+
|id|name                    |username        |email                    |address|phone                |website      |company|
+--+------------------------+----------------+-------------------------+-------+---------------------+-------------+-------+
|1 |Leanne Graham           |Bret            |Sincere@april.biz        |...    |1-770-736-8031 x56442|hildegard.org|...    |
|2 |Ervin Howell            |Antonette       |Shanna@melissa.tv        |...    |010-692-6593 x09125  |anastasia.net|...    |
|3 |Clementine Bauch        |Samantha        |Nathan@yesenia.net       |...    |1-463-123-4447       |ramiro.info  |...    |
|4 |Patricia Lebsack        |Karianne        |Julianne.OConner@kory.org|...    |493-170-9623 x156    |kale.biz     |...    |
|5 |Chelsey Dietrich        |Kamren          |Lucio_Hettinger@annie.ca |...    |(254)954-1289        |demarco.info |...    |
|6 |Mrs. Dennis Schulist    |Leopoldo_Corkery|Karley_Dach@jasper.info  |...    |1-477-935-8478 x6430 |ola.org      |...    |
|7 |Kurtis Weissnat         |Elwyn.Skiles    |Telly.Hoeger@billy.biz   |...    |210.067.6132         |elvis.io     |...    |
|8 |Nicholas Runolfsdottir V|Maxime_Nienow   |Sherwood@rosamond.me     |...    |586.493.6943 x140    |jacynthe.com |...    |
|9 |Glenna Reichert         |Delphine        |Chaim_McDermott@dana.io  |...    |(775)976-6794 x41206 |conrad.com   |...    |
|10|Clementina DuBuque      |Moriah.Stanton  |Rey.Padberg@karina.biz   |...    |024-648-3804         |ambrose.net  |...    |
+--+------------------------+----------------+-------------------------+-------+---------------------+-------------+-------+

1
尝试以下操作:
cat input.json
    | jq '.aggregations.overall.buckets[0].agg_per_name.buckets[] |
    .key + ", " + (.totalMaxUptime_perDays.buckets[] |
    .key_as_string + ", " + (.totalMaxUptime.value | tostring))' |column -t -s,

2
你好,欢迎来到Stackoverflow!如果您能添加一个解释所提供的命令以回答问题,那将非常棒,这样问题的提问者就知道这里发生了什么。 - Brandon Haugen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接