使用jq将数组转换为字符串

3
我有一个格式为[]["a","b","c"]的原因数组json。基本上,我想将json中的drop_reasons=["a","b","c"]替换为drop_reasons="a,b,c"。我知道我们可以使用jq的join(",")来实现这一点。然而,不知道如何在json中修改它。
我尝试过这个命令:cat test.json | jq ' .drop_reasons = .drop_reasons | join(",") ' | sponge test.json,但似乎没有起作用,它试图连接整个json而不是只有drop_reasons。我该怎么解决?任何帮助将不胜感激。谢谢。
示例json如下:
{"id":11828997,"user":"8ddbceef-c374-44be-82f6-996b9d3f9cbd","timestamp":"2020-08-12T05:50:00+05:30","claim_timestamp":"2020-08-12T20:30:58+05:30","unique_key":"d56af2a7-10b8-4a98-b12c-a8aeab9fc56e","platform":"android","location_type":"indoor","activity_type":"unknown","activity_confidence":0,"total_day_steps":151744,"gf_total_steps":0,"step_count":122,"session_id":"1792b79c-1490-4b13-83e2-3c50ebce28f4","label":"indoor","is_claimed":false,"is_dropped":false,"drop_reasons":[],"is_valid":false,"invalid_reason":["steps>allowed_freq"],"conversion":null,"createdAt":"2020-08-12T20:30:58.385285+05:30","updatedAt":"2020-08-12T20:30:58.385285+05:30","location_uuid":null,"location_latitude":28.6673,"location_longitude":77.3915,"location_accuracy":1000,"location_speed":0,"location_timestamp":"2020-08-12T05:46:40+05:30","location_altitude":0,"location_ios_distance_filler":null,"location_ios_desired_accuracy":null,"location_distance_filter":0,"location_desired_accuracy":0,"location_course":0,"location_floor":null,"meta_data_geo_string":"28.6672867,77.3914746","meta_data_timezone":"Asia/Kolkata","meta_data_device_model":"Redmi Note 8 Pro","meta_data_device_brand":"redmi","meta_data_device_manufacturer":"xiaomi","meta_data_app_version":"0.9.31","meta_data_bundle_id":"com.pepkit.ssg","meta_data_build_no":"213","meta_data_plan_id":"a562ad72-54a9-4aea-941c-7f075e2a8b18"}
2个回答

4

使用仅包含相关键的简化样本JSON对象:

$ cat test.json
{
    "drop_reasons": ["a","b","c"]
}
$ jq '.drop_reasons |= join(",")' test.json
{
  "drop_reasons": "a,b,c"
}

如果使用空数组,你的样本会变成空字符串。


x |= y 实际上是 x = (x | y) 的简写。括号是你尝试中缺少的,这是由于 jq 优先级规则需要它们。


1
添加了样本 JSON。 - Divyang Shah
哇!太棒了,我知道 '|=' 这个更新符号,但上次使用它时,它更新了所有值为同一个值,可能是我用错了,不管怎样,谢谢! - Divyang Shah

-3

我不熟悉jq,但是如果你只需将每个","替换为,,就可以达到效果。这是一个hack解决方案,所以如果输入数据格式发生变化,它可能会失效。

$ cat temp.txt 
drop_reasons=["a","b","c"]

$ perl -pe 's/","/,/g' temp.txt
drop_reasons=["a,b,c"]


这将更改JSON中的所有逗号。 - Divyang Shah
如果它们被双引号包围,那么是的。根据示例数据,它应该可以工作。如果您有更完整的输入文件可以分享,我可以做得更好。不过,这可能会是一个Python脚本。 - ShawnMilo

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