【问题标题】:Attempting to use JQ to process json data : Elasticsearch bulk index api尝试使用 JQ 处理 json 数据:Elasticsearch 批量索引 api
【发布时间】:2019-11-18 07:08:40
【问题描述】:

这个问题来自以下帖子:

Elasticsearch Bulk JSON Data

jq -c -r ".[]" C:\setting-es.json | while read line; do echo '{"index":{}}'; echo $line; done > bulk.json

上面的 jq shell 命令抛出错误“Missing statement body in do loop”

我试图改变语法,但仍然无法正常工作。我正在尝试编写一个 shell 脚本来为 elasticsearch 的批量 api 转换以下数据:

[{
    "codeId": "111",
    "association": [{
        "associationId": 123,
        "businessUnitsAssociationId": 1,
        "financialBusinessUnits": "DCS",
        "businessApprovalLimit": [{
            "businessApprovalLimitApprovalLimitId": 1,
            "itemMinAmount": "0.00",
            "itemMaxAmount": "0.00"
        }, {
            "businessApprovalLimitApprovalLimitId": 2,
            "itemMinAmount": "0.00",
            "itemMaxAmount": "0.00"
        }, {
            "businessApprovalLimitApprovalLimitId": 3,
            "itemMinAmount": "0.00",
            "itemMaxAmount": "0.00"
        }]
    }]
}]

我正在尝试将其转换为以下内容:

{"index":{}}
[{"codeId":"111","association":[{"associationId":123,"businessUnitsAssociationId":1,"financialBusinessUnits":"DCS","businessApprovalLimit":[{"businessApprovalLimitApprovalLimitId":1,"itemMinAmount":"0.00","itemMaxAmount":"0.00",},{"businessApprovalLimitApprovalLimitId":2,"itemMinAmount":"0.00","itemMaxAmount":"0.00",},{"businessApprovalLimitApprovalLimitId":3,"itemMinAmount":"0.00","itemMaxAmount":"0.00",}]}]


【问题讨论】:

  • TrueFalse 是否有意或错误地拼写为无效的 JSON 值(在 JSON 中完全拼写为小写)?
  • @Dmitry 我已经修复了它,但无论如何这只是虚拟数据
  • @Dmitry jtc 怎么知道每个 json 数据是如何被代理的?在我的虚拟数据中,我有五个数据点,它如何知道每个数据点是如何分开的?我问这个是因为我的 actual 数据集有嵌套值,每个数据点都是分开的。如果需要,我可以分享
  • @cluis92,在这种情况下,同样的jtc 可以工作(但-a 选项可以删除,它是多余的,因为它现在是一个JSON)。
  • @cluis92,对,但这不是必需的,显示一个足以解释输入概念并允许构建正确解决方案的 sn-p 就足够了。

标签: json elasticsearch jq


【解决方案1】:

在更正无效的 JSON 之后(即,在删除两个多余的逗号之后),这是修改后问题的答案。

仍然不需要 shell 循环。

在 bash 或类似 bash 的提示符下:

jq -c '.[] | ({"index":{}}, [.])'  input.json

在 Powershell 提示符下,将 jq 程序放入文件中并使用 -f FILENAME 选项调用 jq 可能更容易。

【讨论】:

  • 示例 json 中不仅有多余的逗号,还缺少大括号和方括号。我已修复它,但它正在等待审核。
  • @peak 那么这个 jq 命令是否可以从 shell 脚本(例如 windows powershell)运行?这是我尝试过的jq -c '.[] | ({"index":{}}, [.])' jq -c '.[] | ({"index":{}}, [.])' @C:\Users\chris\dummy-json.json,它在 powershell 中显示“无法打开文件 jq”
  • 谢谢@peak 标记为已接受。这对我有用jq -c '.[] | ({"index":{}}, [.])' activity-es-jq.json > bulk-activity.json
【解决方案2】:

[此回复基于原始问题。]

不需要任何shell循环:

$ jq -c '{"index":{}},.' input.json
{"index":{}}
{"str field":"some string","int field":12345,"bool field":true}
{"index":{}}
{"str field":"another string","int field":42,"bool field":false}
{"index":{}}
{"str field":"random string","int field":3856452,"bool field":true}
{"index":{}}
{"str field":"string value","int field":11111,"bool field":false}
{"index":{}}
{"str field":"last string","int field":54321,"bool field":true}

【讨论】:

  • 所以我需要一个循环的原因是因为我的数据比上面的要大得多,并且它没有 {"index":{}} 作为每个数据点之间的标题(它在技术上是无效的json,但这是 elasticsearch 接受数据的唯一方式..)
猜你喜欢
  • 2016-01-25
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
  • 2016-04-16
  • 2018-01-17
  • 2017-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多