json jq:在数组的各个部分上应用不同的函数/Map

j1dl9f46  于 2023-10-21  发布在  其他
关注(0)|答案(1)|浏览(96)

JSON输入是一个简单的集合
我希望根据它们的名称a1,..,an-> {“a1”:v1,...“an ':vn} jq -j '[.a1,.a2,..,. an]'来挑选它的一些元素。
然后用不同的函数f,g...从而最终得到[f(v1),.,f(vk),g(vk+1),.,g(vn)]
使用单个函数,过滤器将是:jq -j '[.a1,.a2,..,. an]| map(.|(f)“
但是我看不到语法,如果有的话,应用不同的函数f,g,.在不同的范围内
让我举一个具体的例子:
首先,我有一个JSON,它是从手机上的GPS位置得到的(使用termux-location)

{
  "latitude": 66.32418638,
  "longitude": -121.77029769,
  "altitude": 465.46502685546875,
  "accuracy": 17.6742248535156,
  "vertical_accuracy": 36.48805236816406,
  "bearing": 0.0,
  "speed": 0.0,
  "elapsedMs": 55,
  "provider": "gps"
}

我想提取纬度,经度,海拔,精度和处理它们不同:将前2位取5位小数,最后2位取最接近的整数,保留1位
拆分时:

jq -j '[.latitude,.longitude]|map(.*100000|round/100000)' in.json
jq -j '[.altitude,.accuracy]|map(.|round)' in.json
jq -j '.provider' in.json

**q1.但是人们能很容易地将这样的过滤器合并组合成一个吗?

当处理更大的数组时,是否可以在索引范围内使用不同的函数(而不必命名属性)?
q3.或者需要构建一个全局map()函数,并使用不同的大小写,返回f(.),g(.),.根据范围?**为了解决q3,我尝试使用index(),但我在JQ中的水平仍然太差...

  • 错误代码 *
jq -j '[.latitude,.longitude,.altitude,.accuracy]|map(if .|index<2 then .*100000|round/100000 else .|round end)'
v1l68za4

v1l68za41#

你可以在构造数组时直接应用这些函数:

[
  (.latitude, .longitude | .*100000 | round/100000),
  (.altitude, .accuracy | round),
  .provider
]

Demo
或者使用范围应用函数:

[.latitude, .longitude, .altitude, .accuracy, .provider]
| .[0:2] |= map(.*100000 | round/100000)
| .[2:4] |= map(round)

Demo
您也可以将其 Package 在自定义过滤器中,将索引和Map函数作为参数:

def myfun(i;j;f): .[i:j] |= map(f);

[.latitude, .longitude, .altitude, .accuracy, .provider]
| myfun(0; 2; .*100000 | round/100000)
| myfun(2; 4; round)

Demo
给定样本输入的输出:

[
  66.32419,
  -121.7703,
  465,
  18,
  "gps"
]

相关问题