无法选择以jq中的数字开头的字段(参考其他示例)

时间:2018-04-04 09:37:14

标签: json jq

我已经看到过在以下页面中为其他人提供的建议解决方案,但我无法使用jqplay浏览器shell为我工作:

https://github.com/stedolan/jq/issues/344

https://github.com/stedolan/jq/issues/345

https://github.com/stedolan/jq/issues/1304

鉴于此数据:

{
    "api_version": 4,
    "error": null,
    "result": [
        {
            "labelId": "ALL",
            "labelName": "ALL",
            "samples": 30104,
            "avgResponseTime": 6.849,
            "90line": 8,
            "95line": 9,
            "99line": 36,
            "minResponseTime": 2,
            "maxResponseTime": 1951,
            "avgLatency": 5.287,
            "geoMeanResponseTime": 5.484,
            "stDev": 23.765,
            "duration": 302,
            "avgBytes": 110.224,
            "avgThroughput": 99.682,
            "medianResponseTime": 5,
            "errorsCount": 0,
            "errorsRate": 0,
            "hasLabelPassedThresholds": null
        },
        {
            "labelId": "3687c89fac2385d28d53b356d4785418",
            "labelName": "100b 3600s Cache",
            "samples": 7300,
            "avgResponseTime": 6.028,
            "90line": 7,
            "95line": 8,
            "99line": 11,
            "minResponseTime": 2,
            "maxResponseTime": 680,
            "avgLatency": 6.021,
            "geoMeanResponseTime": 5.203,
            "stDev": 16.233,
            "duration": 300,
            "avgBytes": 16.581,
            "avgThroughput": 24.333,
            "medianResponseTime": 5,
            "errorsCount": 0,
            "errorsRate": 0,
            "hasLabelPassedThresholds": null
        },
        {
            "labelId": "f88f8ff81bf9b521134637639a0277be",
            "labelName": "100b NonCache",
            "samples": 729,
            "avgResponseTime": 6.143,
            "90line": 7,
            "95line": 7,
            "99line": 9,
            "minResponseTime": 3,
            "maxResponseTime": 877,
            "avgLatency": 6.136,
            "geoMeanResponseTime": 4.627,
            "stDev": 32.817,
            "duration": 295,
            "avgBytes": 1.64,
            "avgThroughput": 2.471,
            "medianResponseTime": 4,
            "errorsCount": 0,
            "errorsRate": 0,
            "hasLabelPassedThresholds": null
        }
    ]
}

我最初尝试过:

[.result[] | {labelName: .labelName, samples: .samples, avgResponseTime: .avgResponseTime, 90line: .90line, 95line: .95line, 99line: .99line, minResponseTime: .minResponseTime, maxResponseTime: .maxResponseTime, avgLatency: .avgLatency, geoMeanResponseTime: .geoMeanResponseTime, stDev: .stDev, durationSeconds: .durationSeconds, avgBytes: .avgBytes, avgThroughput: .avgThroughput, medianResponseTime: .medianResponseTime, errorCount: .errorsCount, errorRate: .errorsRate, hasLabelPassedThresholds: .hasLabelPassedThresholds}]

得到了

jq: error: syntax error, unexpected LITERAL (Unix shell quoting issues?) at <top-level>, line 1:
[.result[] | {labelName: .labelName, samples: .samples, avgResponseTime: .avgResponseTime, 90line: .90line, 95line: .95line, 99line: .99line, minResponseTime: .minResponseTime, maxResponseTime: .maxResponseTime, avgLatency: .avgLatency, geoMeanResponseTime: .geoMeanResponseTime, stDev: .stDev, durationSeconds: .durationSeconds, avgBytes: .avgBytes, avgThroughput: .avgThroughput, medianResponseTime: .medianResponseTime, errorCount: .errorsCount, errorRate: .errorsRate, hasLabelPassedThresholds: .hasLabelPassedThresholds}]                                                                                           
jq: 1 compile error
exit status 3

看看之前链接中提到的类似问题,我试图解决这样的问题:

[.result[] | {labelName: .labelName, samples: .samples, avgResponseTime: .avgResponseTime, 90line: .[“90line”], 95line: .[“95line”], 99line: .[“99line”], minResponseTime: .minResponseTime, maxResponseTime: .maxResponseTime, avgLatency: .avgLatency, geoMeanResponseTime: .geoMeanResponseTime, stDev: .stDev, durationSeconds: .durationSeconds, avgBytes: .avgBytes, avgThroughput: .avgThroughput, medianResponseTime: .medianResponseTime, errorCount: .errorsCount, errorRate: .errorsRate, hasLabelPassedThresholds: .hasLabelPassedThresholds}]

处理以数字字符开头的字段。然而,我仍然会遇到相同的语法错误,所以我无法将我的期望与我在其他解决方案中看到的一致。我只是无法弄清楚我做错了什么,我尝试了各种其他引用或尝试像|没有用。

编辑:回应下面的建议答案:

嗯,我无法得到它。回顾一下:

{
    "api_version": 4,
    "error": null,
    "result": [
        {
            "labelId": "ALL",
            "labelName": "ALL",
            "samples": 30104,
            "avgResponseTime": 6.849,
            "90line": 8,
            "95line": 9,
            "99line": 36,
            "minResponseTime": 2,
            "maxResponseTime": 1951,
            "avgLatency": 5.287,
            "geoMeanResponseTime": 5.484,
            "stDev": 23.765,
            "duration": 302,
            "avgBytes": 110.224,
            "avgThroughput": 99.682,
            "medianResponseTime": 5,
            "errorsCount": 0,
            "errorsRate": 0,
            "hasLabelPassedThresholds": null
        }
    ]
}

jq位:

jq '[.result[] | {labelName: .labelName, samples: .samples, avgResponseTime: .avgResponseTime, minResponseTime: .minResponseTime, maxResponseTime: .maxResponseTime, avgLatency: .avgLatency, geoMeanResponseTime: .geoMeanResponseTime, stDev: .stDev, durationSeconds: .durationSeconds, avgBytes: .avgBytes, avgThroughput: .avgThroughput, medianResponseTime: .medianResponseTime, errorCount: .errorsCount, errorRate: .errorsRate, hasLabelPassedThresholds: .hasLabelPassedThresholds, “90line”: .[“90line”], “95line”: .[“95line”], “99line”: .[“99line”]}]'

返回:

jq:错误:语法错误,意外的INVALID_CHARACTER(Unix shell引用问题?)在第1行:

1 个答案:

答案 0 :(得分:1)

您需要引用以数字开头的键的键名,例如

"90line": .["90line"]

另请注意,jq表达式{"90line": .["90line"]}可以缩写为{"90line"}

实施例

输入您的信息:

$ jq '[.result[] | {labelName, "90line": .["90line"] } ]' input.json
[
  {
    "labelName": "ALL",
    "90line": 8
  },
  {
    "labelName": "100b 3600s Cache",
    "90line": 7
  },
  {
    "labelName": "100b NonCache",
    "90line": 7
  }
]